Mam text.txt plik tekstowy, który czyta (dla celów uproszczenia)Jak odczytać i nadpisać plik tekstowy w C?
this is line one
this is line two
this is line three
znowu dla uproszczenia, jestem po prostu próbuje ustawić pierwszego znaku w każdym wierszu na „x”, więc moim pożądanego rezultatu byłoby
xhis is line one
xhis is line two
xhis is line three
Więc jestem otwierając plik text.txt i próbuje zastąpić każdą linię z pożądanym wyjściem do tego samego pliku tekstowego. W pętli while ustawiam pierwszy znak w każdej linii na "x". Ustawiam również zmienną "line" równą jeden, ponieważ jeśli jest ona w pierwszym wierszu, chcę przewinąć do początku pliku, aby nadpisać na początku zamiast na końcu pliku. Linia jest następnie inkrementowana, więc pominie przewijanie do następnej iteracji i powinna kontynuować nadpisywanie drugiej i trzeciej linii. Działa idealnie na pierwszą linię.
Ktoś ma jakieś rozwiązania? BTW, badałem to obszernie zarówno na stackoverflow i innych stronach, i bez powodzenia. Oto mój kod i moje wyjście jest również poniżej:
#include <stdio.h>
#include <stdlib.h>
#define MAX 500
int main() {
char *buffer = malloc(sizeof(char) * MAX);
FILE *fp = fopen("text.txt", "r+");
int line = 1;
while (fgets(buffer, 500, fp) != NULL) {
buffer[0] = 'x';
if (line == 1) {
rewind(fp);
fprintf(fp, "%s", buffer);
}
else {
fprintf(fp, "%s", buffer);
}
line++;
}
free(buffer);
fclose(fp);
}
wyjściowa:
xhis is line one
this is line two
xhis is line two
e
x
Nie można zastąpić pliku podczas czytania. Cóż, możesz, ale dostajesz zniekształcone dane. Jaki jest twój system operacyjny? Jeśli jest to Linux/Unix, po prostu usuń plik po jego otwarciu - "unlink (" text.txt "); - następnie otwórz ** nowy plik o tej samej nazwie i zapisz zmodyfikowane linie do nowego pliku. Będziesz mieć ** dwie ** zmienne 'FILE *'. –
Musi być umieszczony na początku linii. – BLUEPIXY
Przepisywanie plików w miejscu jest trudne. Jednym z mało znanych ważnych faktów jest to, że po przeczytaniu dokładnego miejsca, w którym chcesz zacząć pisać, musisz wywołać coś takiego jak 'fseek (fp, 0, SEEK_CUR)' zanim zaczniesz pisać. A potem znowu, gdy skończysz pisać, zanim zaczniesz czytać ponownie. –