Problem z zapisem do pliku
Ostatnio zmodyfikowano 2014-01-12 11:42
aruenne Temat założony przez niniejszego użytkownika |
Problem z zapisem do pliku » 2014-01-12 00:24:37 Witam! Mam program, który ma wyszukiwać w pliku tekstowym ciąg znaków podany na wejście i zamienić na inny ciąg (też podany na wejście). Problem polega na tym, że zamienia, owszem, ale tylko w I linijce pliku tekstowego. A w następnych(gdzie ten ciąg występuje) już nie. Proszę o pomoc :) #include<iostream> #include<cstdlib> #include<fstream> #include<cstring> #include<stdio.h>
using namespace std;
void zerowanie( char[], char[] );
int main() { char a[ 200 ]; char b[ 200 ]; string linia; char tablica[ 200 ]; fstream plik( "test.txt", ios::in | ios::out ); if( !plik ) { cout << "Plik nie zostal otwarty" << endl; return 1; } zerowanie( a, b ); noskipws( plik ); cout << "Podaj ciag znakow" << endl; cin >> a; cout << endl << "Na co zamienic?" << endl; cin >> b; plik.seekp( 0 ); int licznik = 0; int licznika = 0; for( int i = 0; i < 200; i++ ) { if( a[ i ] != ' ' ) licznika = licznika + 1; } int licznikb = 0; for( int i = 0; i < 200; i++ ) { if( b[ i ] != ' ' ) licznikb = licznikb + 1; } if( licznika > licznikb ) licznik = licznika; else licznik = licznikb; while( plik ) { plik.getline( tablica, 200 ); linia = tablica; long pozycja = linia.find( a ); plik.seekp( pozycja ); plik.write( reinterpret_cast < char *>( & b ), licznik ); } plik.close(); return 0; }
void zerowanie( char a[], char b[] ) { for( int i = 0; i < 200; i++ ) a[ i ] = ' '; for( int i = 0; i < 200; i++ ) b[ i ] = ' '; }
|
|
mav_ax_13h |
» 2014-01-12 10:10:35 Problem, jak się zapewne domyślasz dotyczy linijek: while( plik ) { plik.getline( tablica, 200 ); linia = tablica; long pozycja = linia.find( a ); plik.seekp( pozycja ); plik.write( reinterpret_cast < char *>( & b ), licznik ); }
long pozycja wskazuje gdzie znajduje się szukany tekst w stringu, a nie w pliku, natomiast seekp ustawia pozycje w pliku względem początku pliku. Dodatkowo, w każdej linijce sprawdzasz tylko pierwszy pasujący wyszukiwany tekst, a następnie odczytujesz kolejną linie z pliku, co sprawi, że w przypadku tekstu: coś tam coś tam szukany_tekst coś tam coś tam szukany_tekst coś tam...\n zostanie "zastąpiony" tylko pierwszy szukany tekst. Inna sprawa, że takie zapisywanie na ślepo sprawi, że będziesz miał w pliku same śmieci, nie licząc przypadku kiedy tekst wyszukiwany i ten którym chcesz zastąpić będą takiej samej długości: szukany = ala zastap = alicja i z tekstu "ala ma kota" robisz "alicja kota" lub w drugą strone: szukany = alicja zastap = ala i z tekstu "alicja ma kota" robisz "alacja ma kota"
Jak dla mnie wygodniej było by to zrobić tak: 1. odczytaj cały plik do stringa 2. wyszukaj pierwszy szukany wyraz 3a. jesli długosć "szukany" i "zastap" takie same wpisz na tą pozycje wyraz "zastap" 3b. jeśli nie, tworz nowy string na zasadzie: stringOdczytganyZpliku = stringOdczytganyZpliku<0, pozycja "wyszukany"> + zastap + stringOdczytganyZpliku<pozycja "wyszukany" + dlugosc wyszukany, do konca stringOdczytganyZpliku>; gdzie <,> oznacza wytnij_ze_stringa<od, do> 4. szukaj nastepnego pasujacego wyrazu i skocz do poz 3 5. zapisz string do pliku |
|
aruenne Temat założony przez niniejszego użytkownika |
» 2014-01-12 10:59:55 Dziękuję za odpowiedź. :) Tak, tylko... nie umiem sobie poradzić z tym problemem. Dlatego też napisałam. Niestety nie mogę wczytać całego pliku do stringa. Zadanie polega na tym, że w założeniu plik jest nieskończenie duży i mam wczytywać jakimiś partiami. |
|
Monika90 |
» 2014-01-12 11:42:41 Możesz wczytywać z jednego pliku, a zapisywać do drugiego - tymczasowego. Na koniec usunąć plik z którego wczytywałaś dane i zmienić nazwę pliku tymczasowego na taką jaką miał ten plik z którego wczytywałaś. |
|
« 1 » |