Mam zrobić program który wczytuje z pliku dane, robi na nich jakieś operacje i wyniki zapisuje do pliku.
Otwieram plik do odczytu i zapisu (fstream) wczytuje dane do tablicy, następnie zmieniam i wyniki zapisuje w tym samym pliku z którego wczytywałem dane. I tu mam problem. **Czy da się zapisać dane do określonego wiersza **?
Wiem jak zapisać dane w pliku od końca, a ja muszę pobrać wartość z pliku zmienić ją i w miejscu poprzedniej wartości zapisać nową.
Gdy juz odczytasz dane, oblicz ich dlugosc, a nastepnie cofnij wskaznik pliku o ta dlugosc i dopiero zapisuj. Musisz otworzyc plik w trybie nadpisywania.
cos takiego moze, jesli musza byc strumienie:
fstream file;
char *buff;
file.open(argv[1], fstream::in);
file.seekg(0, ios::end);
size_t len = file.tellg();
file.seekg(0, ios::beg);
buff = new char[len];
file.read(buff, len);
file.close();
file.open(argv[1], fstream::in | fstream::out | fstream::trunc);
buff[0] = 'b';
file.write(buff, len);
file.close();
delete [] buff;
Mógłbyś podpowiedzieć jak to mam zrobić ?
W C++ dopiero zaczynam pisać.
Nie da się wpisać czegoś w pliku do środka. Musisz wczytać wszystkie dane do tablicy, zmienić ciąg, który potrzebujesz i nadpisać stary plik :)
Blood napisał(a)
Nie da się wpisać czegoś w pliku do środka.
Da sie jak najbardziej, otwierajac plik za pomoca fopen w trybie r+ ;)
No dać się da, ale zdaje się, że i tak będzie musiał wszystkie dane za początkiem wpisywania zapamiętać i potem dodać do pliku po zakończeniu edycji.
Nie bedzie musial, sprawdz ten przyklad:
echo "abcdef" > plik
#include <cstdio>
int main(void)
{
FILE *fp = fopen("./plik", "r+");
fseek(fp, 2, SEEK_SET);
fputc('z', fp);
fclose(fp);
return 0;
}
Aha, no tak. Putować można. Lecz jeżeli będzie chciał coś usunąć i dodać na to miejsce?
Jak to co chce dodac bedzie mialo taki sam rozmiar jak miejsce, w ktorym chce to zapisac to po prostu nadpisze, ale jezeli bedzie chcial dodac cos o innym rozmiarze to trzeba kombinowac - mozna zawsze trzymac dane w pliku pogrupowane w bloki o stalym rozmiarze i cale bloki nadpisywac.