2015-10-17 6 views
-1

Я новичок в C и обработке файлов, и я пытаюсь распечатать содержимое файла. Я использую Code :: Blocks, если это имеет значение. Это мой код:C программа, не читающая из файла

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
int main(void) 
{ 
    char c; 
    FILE *f; 
    f = fopen("filename.txt", "rt"); 

    while((c=fgetc(f))!=EOF){ 
     printf("%c", c); 
    } 
    fclose(f); 
    return 0; 
} 
+4

ОК, и в чем проблема? – melpomene

+2

'if (f == NULL) ... // обработка ошибок' –

+1

Присвоение результата' fgetc' символу 'char' неверно. 'EOF' не является' char'. – melpomene

ответ

0

Быстрое примечание на непредсказуемое поведение: Если бы мы должны были предположить, что он выходит из строя, то мы бы определение его разбить ... Мы не можем сделать это, потому что это не определено. Все, что мы можем сказать, состоит в том, что неопределенное поведение не переносится, вероятно, нежелательно и, конечно же, его следует избегать.


Согласно the fopen manual, есть шесть стандартных режимов для открытия файла, и "rt" не один из них.

Я процитировал раздел, в котором перечислены эти шесть стандартных режимов. Обратите внимание на акцент (мой), указав, что поведение не определено, если вы выберете что-то другое, кроме одного из этих стандартных режимов.

Аргумент режима указывает на строку. Если строка является одной из следующих, файл должен быть открыт в указанном режиме. В противном случае поведение не определено.

r или rb

Open file for reading. 

w или wb

Truncate to zero length or create file for writing. 

a или ab

Append; open or create file for writing at end-of-file. 

r+ или rb+ или r+b

Open file for update (reading and writing). 

w+ или wb+ или w+b

Truncate to zero length or create file for update. 

a+ или ab+ или a+b

Append; open or create file for update, writing at end-of-file. 

Хорошо, поэтому, имея в виду, вы, вероятно, намеревались использовать режим "r". Следуя fopen, вам необходимо убедиться, что файл открыт успешно, как упомянули другие люди в комментариях. Есть много ошибок, которые могут возникнуть, так как я уверен, что вы можете вывести ... Ваша обработка ошибок, вероятно, следует искать что-то вроде этого:

f = fopen("filename.txt", "r"); 
if (f == NULL) { 
    puts("Error opening filename.txt"); 
    return EXIT_FAILURE; 
} 

Другие также обратили внимание на тип возвращаемого fgetc; он не возвращает char. Он возвращает int, и не без оснований.В большинстве случаев он успешно возвращает одно из (типично) 256 символов, как положительное значениеunsigned char, преобразованное в int. Иногда, однако, вы получите отрицательныйint значение, EOF. Это значение int, а не значение символа. Единственные значения символов fgetc Возврат положителен.

Таким образом, вы должны также выполнить обработку для fgetc ошибки, например, так:

int c = getchar(); 
if (c == EOF) { 
    return 0; 
} 
Смежные вопросы