2015-07-09 3 views
0

Я пытаюсь распечатать содержимое файла с примерно 4000 символами. Как-то программа записывает только первые 220 символов и заканчивается.Весь файл не читается в C (EOF встречается неожиданно)

int main(void) 
{ 
    char ch = ' ', file_name[25], payload[3904]; 
    FILE *fp; 
    printf("Enter the name of file you wish to see\n"); 
    gets(file_name); 
    fp = fopen(file_name, "r"); // read mode 
    if (fp == NULL) 
    { 
     perror("Error while opening the file.\n"); 
     exit(EXIT_FAILURE); 
    } 

    printf("The contents of %s file are :\n", file_name); 

    int gin = 0; 
    while ((ch = fgetc(fp)!=EOF)) 
    { 
     printf("%d) %x \n",gin, ch); 
     payload[gin++] = ch; 
    } 
    printf("Also, value of gin is %d --->", gin); 
    getchar(); 

    //...rest of the code 
} 

Здесь значение gin является 220.

Просто, чтобы проверить, я изменил while() условие запуска для точного количества символов в файле:

{ 
//... 

while (gin<3904) 
{ 
    if ((ch = fgetc(fp)) == EOF) res++;//ADDED THIS TO COUNT NUMBER OF EOF's 
    printf("%d) %x \n",gin, ch); 
    payload[gin++] = ch; 
    //printf(" %x \n", payload[(gin - 1)]); 

    if (gin % 100 == 0)  
    { 
     printf("Also, value of res is %d --->", res); getchar(); 
     getchar(); 
    } 
} 

//...rest of the code 
} 

Величина gin достигает 3904, значение res (количество EOF) равно 3684, что означает, что каждый символ после первого 220 считывается как EOF. Программа начинает читать FF после первого 220 символов, даже если она заполнена.

+2

Вы хотите сделать '' c' в int'. Посмотрите, какой тип 'fgetc()' возвращает. – alk

+3

'gets()' is danger ... вместо этого используйте 'fgets()'. –

+0

@sourav он говорит: «слишком мало символов для фейсов» –

ответ

4

Я думаю, что код в порядке, кроме того, что вы должны изменить ch на int.

fgetc() возвращает

  • Если успех, "символ читается как беззнаковое полукокса преобразованный в int"
  • неудачей, "EOF на конец файла или ошибка"

Итак, во-первых, вы должны изменить ch на int, так как некоторые повторно значения поворота от fgetc() не могут соответствовать a char.

Теперь, во втором случае вы не проверяете возвращаемое значение fgetc() против EOF, чтобы обнаружить любую ошибку. Вы просто берете возвращаемое значение и пытаетесь сохранить эти значения в массиве. Фактически, когда конец файла достигнут, читать больше нечего, и все последующие чтения на одном и том же указателе файла возвратят вам ошибку.

Скорее всего, эти значения. после 220 в вашем случае действительный, на всех.

Итак, утверждение в вашем вопросе,

(EOF происходит неожиданно)

неправильно. Это происходит просто отлично, вы игнорируете его и бегаете, ну, проблема.


Примечание:

  1. В своем первом фрагменте кода, вы делаете два последовательных fgetc() вызовов, по существу, отбрасывая результат первого, а с помощью второй без какой-либо проверки.
  2. Никогда не использовать gets().Он страдает от проблем с переполнением буфера. Вместо этого всегда используйте fgets().
+0

Я изменил данные тип и ch и полезная нагрузка [], но проблема сохраняется. Он печатает правильные значения до 220, затем «ffffffff» –

+0

@paneerchatpata в файле всего 220 действительных символов, кроме того, все сообщения являются ошибками. –

+0

мой файл явно содержит более 220 символов. Возможно ли, что ошибка связана с использованием od fgetc? –

0

следующий код:

uses fgets() rather than the obsolete gets() 
removed the newline from the user input 
uses the proper size_t rather than int for indexing 
is consistently indented 
has modification to the printf statements to display size_t rather than int 
compiles cleanly (which surprises me as payload is set but never used) 

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

int main(void) 
{ 
    int ch = ' '; 
    char file_name[25]; 
    char payload[3904]; 
    FILE *fp; 

    printf("Enter the name of file you wish to see\n"); 
    fgets(file_name, sizeof(file_name), stdin); 

    // remove trailing newline 
    char *newline = strstr(file_name, "\n"); 
    if (newline) *newline = '\0'; 

    fp = fopen(file_name, "r"); // read mode 
    if (fp == NULL) 
    { 
     perror("Error while opening the file.\n"); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, fopen successful 

    printf("The contents of %s file are :\n", file_name); 

    size_t gin = 0; 
    while (((ch = fgetc(fp)!=EOF)) && (sizeof(payload) > gin)) 
    { 
     printf("%ld) %x \n",gin, ch); 
     payload[gin++] = ch; 
    } 

    printf("Also, value of gin is %ld --->", gin); 
    getchar(); 

    //...rest of the code 
    return(0); 
} 
Смежные вопросы