2013-06-25 2 views
0

Я хотел написать, прочитать и распечатать в том же файле. Но когда программа выполняется, она может писать, но не может читать или печатать данные, которые я написал. Когда я запускаю программу, она перестает работать после записи в файл. Я проверил, что файл (penny.txt) содержит данные после операции записи.C Ошибка управления файлом

Я не знаю, где это происходит неправильно - как я могу читать и распечатывать данные? Я совершенно новичок в этом, поэтому, пожалуйста, имейте это в виду, когда отвечаешь.

#include<stdio.h> 

int main() 
{ 
    char ch; 
    char penny[50],pen[50]; 
    FILE *Object; 
    Object = fopen("Penny.txt","w+"); 

    fgets(penny, sizeof penny, stdin); 
    fprintf(Object,penny); 
    fscanf(Object,"%s",pen); 
    printf("%s",pen); 
    return 0; 
} 
+0

Совет: в конце вы должны fclose (Object); –

+0

Добро пожаловать в StackOverflow! Чтобы помочь нам помочь, отправьте пример ввода и вывода и укажите, как он отличается от того, что вы хотите. –

+0

Сбросить выход после записи – wazy

ответ

1
#include<stdio.h> 

int main() 
{ 
    //char ch;//unused! 
    char penny[50],pen[50]; 
    FILE *Object; 
    Object = fopen("Penny.txt","w+"); 

    fgets(penny, sizeof penny, stdin); 
    fprintf(Object,"%s", penny);//it troubled indicator(%) is included 
    fflush(Object);//Buffer flush : So that there is no wrote 
    rewind(Object);//rewind the position of access to the file 
    fscanf(Object,"%s",pen); 
    printf("%s",pen); 
    return 0; 
} 
1

Вы должны использовать fseek() для перемещения назад текущую позицию файла внутри файла.

int fseek (FILE * stream, long int offset, int origin); 

индикатор положения Reposition потока Устанавливает индикатор позиции, связанный с потоком в новое положение.

stream 

Указатель на объект FILE, который идентифицирует поток. offset Двоичные файлы: количество байтов для смещения от начала координат. Текстовые файлы: либо ноль, либо значение, возвращаемое ftell.

origin 

Позиция, используемая как ссылка для смещения. Она задается одним из следующих констант, определенных в исключительно для использования в качестве аргументов для этой функции:

Constant Reference position 
SEEK_SET Beginning of file 
SEEK_CUR Current position of the file pointer 
SEEK_END End of file 

*

попробовать это:

#include<stdio.h> 

int main() 
    { 
     char ch; 
     char penny[50],pen[50]; 
     FILE *Object; 
     Object = fopen("Penny.txt","w+"); 

     fgets(penny, sizeof penny, stdin); 
     fprintf(Object,penny);//now the file is in EOF 
     fseek(Object,-1*(strlen(penny),SEEK_CUR);//<===move back |penny| in the file 
     /* optional or:fseek(Object,0,SEEK_SET);<===move to start of file */ 
     fscanf(Object,"%s",pen); 
     printf("%s",pen); 
     return 0; 
    } 
+0

['fgets'] (http://pubs.opengroup.org/onlinepubs/009695399/функции/fgets.html), возможно, не читал байты sizeof penny. – user7116

+0

вы правы, я меняю его на strlen() –

1

Вы в конце файл, когда вы вызываете fscanf(). Используйте fseek, чтобы вернуться к началу:

/* this ignores a whole host of other issues */ 
fprintf(Object,penny); 
/* optional: fflush(Object); */ 

/* after the call to fprintf you're at the end of the "stream" in this case, 
* go back to the beginning: 
*/ 
fseek(Object, 0, SEEK_SET); 

/* now we have something to read! */ 
fscanf(Object,"%s",pen); 
printf("%s\n",pen); 

Вы не заметили эту проблему в связи с полным отсутствием контроля ошибок. fopen, fprintf и fscanf перечислены все условия ошибки, и все они используют свое возвращаемое значение, чтобы сигнализировать о проблеме. Вы игнорируете эти возвращаемые значения на свой страх и риск.