2015-07-02 28 views
6

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 
+1

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 *'. –

+0

Musi być umieszczony na początku linii. – BLUEPIXY

+0

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. –

Odpowiedz

6
long pos = ftell(fp);//Save the current position 
while (fgets(buffer, 500, fp) != NULL) { 
    buffer[0] = 'x'; 
    fseek(fp, pos, SEEK_SET);//move to beginning of line 
    fprintf(fp, "%s", buffer); 
    fflush(fp); 
    pos = ftell(fp);//Save the current position 
} 
+1

@NattachaiSuteerapongpan Zobacz ** 7.21.5.3 Funkcja fopen p7 ** z [n1570.pdf] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) – BLUEPIXY

+0

I wiem, że twój komentarz został odesłany 2 lata temu, ale właśnie przeczytałem twoją odpowiedź i nie jestem całkiem jasna co do "fflush()". Twój kod działa absolutnie dobrze, ale potem próbowałem usunąć "fflush (fp)" i uruchomić kod. Program utknął w nieskończonej pętli.Odkąd zerwałem program, daje on bardzo dziwny wynik. Naprawdę nie mam pojęcia, dlaczego wyniki wyglądają. Czy możesz mi pomóc wyjaśnić, dlaczego usunięcie fflush daje taki wynik. Oto link do pliku tekstowego (przed i po uruchomieniu programu). https://drive.google.com/drive/folders/0B3cRfiRmMzw6Q01fZ09uX0VOU2c?usp=sharing –

+1

@NattachaiSuteerapongpan Konieczne jest wywołanie 'fflush', jak opisano w linku pokazanym w poprzednim komentarzu. Nie zawsze działa poprawnie, jeśli nie istnieje. Krótko wyjaśniony, jest buforowany, więc musi znaleźć odzwierciedlenie w rzeczywistym pliku. – BLUEPIXY

2

ja zawsze sugerują użycie innego pliku zrobić to kindda rozwiązań.

  1. Czytaj linia
  2. Put X w nowym pliku w linii i skopiuj resztę linii.
  3. Czy to aż dojdziesz EOF
  4. usunąć stary plik
  5. zmienić nazwę tego nowego pliku
0

to wypróbować

#include<stdio.h> 
#include<stdio.h> 
#include<string.h> 
int main() 
{ 
    char buffer[500],read[50][50]; 
    FILE *fp=fopen("text.txt","r+"); 
    int line =1; 
    while(fgets(buffer,500,fp)!=NULL){ 
     buffer[0]='x'; 
     printf("\n%d ",line); 
     puts(buffer); 
     strcat(read[line-1],(const char*)buffer); 
     line++; 
    } 
    fclose(fp); 
    FILE *fp1=fopen("text.txt","w"); 
    rewind(fp1); 
    fprintf(fp1,"%s",read); 
    return 0; 
    } 

Pracowałem na to uwagę na okna

0
// file_overwrite.cpp : main project file. 
// File opens and write y value to a file 
// again reads same file and re-writes y value to a file 

#include "stdafx.h" 

using namespace System; 

#include<stdio.h> 
#include<stdio.h> 
#include<string.h> 
#include <conio.h> 
#include<stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    int x = 19530; 

    FILE *fp1 = fopen("D:\\Data\\BUFF.txt","w+"); 

    if(fp1 == NULL) 
     printf("File not opening \n"); 
     int y=x; 
     fprintf(fp1, "%d \n", y); 
     fclose(fp1); 
     printf("\n file -> open -> write y value and close"); 


     freopen("D:\\Data\\BUFF.txt", "w", fp1); 
     rewind(fp1); 
     y=100; 
     fprintf(fp1, "%d \n", y); 
     printf("\n file -> Reopen -> rewind write y values and close"); 
     fclose(fp1); 

     getch(); 
     return 0; 
} 
+0

Chociaż może się wydawać oczywiste, do jakich przyzwyczajeń używa się niektórych fragmentów kodu, prosimy o rozważenie użycia komentarzy do kodu lub odniesień do dokumentacji podczas odpowiadania na pytanie, aby uzyskać dodatkowe informacje. – Lepidopteron

0
// overwrite_file.cpp 
// File opens and write y value to a file 
// again reads same file and re-writes y value to a file 

#include "stdafx.h" 

using namespace System; 

#include<stdio.h> 
#include<stdio.h> 
#include<string.h>    //Include appropriate headers 
#include <conio.h> 
#include<stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    int x = 19530;       // Give any value in the limit 

    FILE *fp1 = fopen("D:\\Data\\BUFF.txt","w+"); // open file to write 

    if(fp1 == NULL)         // if the file pointer encounters a null, it may not open neither overwrite 
     printf("File not opening \n"); 
     int y=x;          
     fprintf(fp1, "%d \n", y);     //print y 
     fclose(fp1); 
     printf("\n file -> open -> write y value and close"); // close the file after writing the value of y 


     freopen("D:\\Data\\BUFF.txt", "w", fp1);   //reopen and rewind file 
     rewind(fp1); 
     y=100;            // this value of y given within the limits gets printed on the .exe console 
     fprintf(fp1, "%d \n", y); 
     printf("\n file -> Reopen -> rewind write y values and close"); // rewind write values and close 
     fclose(fp1); 

     getch(); 
     return 0; 
}