2015-07-26 3 views
0

используя часть кода, как это:потеря данных при чтении файла с fscanf

fscanf(f1, "%d", &n); 
while(!feof(f1)){ 
... 
fscanf(f1, "%d", &n);} 

мимо последнюю строку файла (EOF встречи). Как мне решить?

единственное решение я нашел это:

if (fscanf(f1, "%d", &n)!=EOF){ 
rewind(f1); 
do{ 
... 
fscanf(f1, "%d", &n); 
}while(!feof(f1)); 
} 

ответ

3

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

Вы не должны проверять наличие feof, но для кода возврата fscanf. Он скажет вам, есть ли какие-то цифры, которые можно разобрать как число.

предположим, что ваш файл содержит "11\n23"

f = fopen(...); 
result = fscanf(f, "%d", &i); 
// result == 1, because one variable has been read 
// i == 11, because that's the first number 
// file pointer is past the '\n', because '\n' 
// had to be read to find out the number is not 
// something like 110 
// The '\n' itself has been put back using ungetc 
// feof(f) == 0, because nothing tried to read past EOF 

result = fscanf(f, "%d", &i); 
// result == 1, because one variable has been read by this call 
// i == 23 (obviously) 
// file pointer is at EOF (it can't go further) 
// feof(f) == 1, because fscanf tried to read past 
// the '3' to check whether there were extra 
// characters. 

// (Your loop terminates here, because feof(f) is true 

result = fscanf(f, "%d", &i); 
// result == EOF (error before first variable) 
// i is likely unchanged. I am unsure whether this 
// is guaranteed by the language definition 
// file pointer unchanged 
// feof(f) still true 

// You should terminate processing *NOW*, because 
// return is no longer one. 
+0

пожалуйста, вы можете написать часть кода, чтобы лучше объяснить? спасибо –

+1

У меня нет ПК для тестирования прямо сейчас, но не должен ли третий код 'fscanf' возвращать -1 (' EOF') в код примера, который вы предоставили? –

+0

@CoolGuy Спасибо за исправление, отредактировано. –

Смежные вопросы