2015-09-11 3 views
-2

Я немного новичок в C, но в основном у меня есть проблема, когда мне нужно прочитать '-1' из файла. К сожалению, это означает, что я столкнулся с преждевременным окончанием файла, потому что константа EOF также равна -1 в моем компиляторе.C - Использование fscanf для чтения '-1' из файла

Какая работа вокруг была бы для этого? Есть ли еще одна функция, которую я могу использовать для ее чтения, которая изменит EOF на то, с чем я могу работать?

Заранее спасибо.

код, так как люди просят за это

int read() { 
    int returnVal; // The value which we return 

    // Open the file if it isn't already opened 
    if (file == NULL) { 
     file = fopen(filename, "r"); 
    } 

    // Read the number from the file 
    fscanf(file, "%i", &returnVal); 

    // Return this number 
    return returnVal; 
} 

Это число затем позже по сравнению с EOF.

Хорошо это, вероятно, плохая практика, но я изменил код к следующему

int readValue() { 
    int returnVal; // The value which we return 

    // Open the file if it isn't already opened 
    if (file == NULL) { 
     file = fopen(filename, "r"); 
    } 

    // Read the number from the file 
    fscanf(file, "%i", &returnVal); 

    if (feof(file)) { 
     fclose(file); 
     return -1000; 
    } 

    // Return this number 
    return returnVal; 
} 

Потому что я знал, что я никогда не читал такого числа из моего файла (они варьируются от примерно [-300, 300] . Спасибо за вашу помощь, ребята!

+0

Не имеет значения, что константа EOF равна -1 ... никогда не должно быть случая, когда вы изучаете прочитанное вами значение и возвращаете его как -1 по какой-либо причине, кроме -1 (или ничего) был прочитан, и ваша память уже содержала -1). Отправьте код, с которым, по вашему мнению, возникли проблемы, и вам может помочь, но без этого этот вопрос является неполным стандартами стека переполнения. – mah

ответ

4

возвращаемое значение fscanf НЕ значение, которое было прочитано, а это число элементов успешно считаны, или EOF, если произошла ошибка.

+0

@Mildan 'fscanf' предоставляет не менее * двух * значений: статус функции как возвращаемое значение и значения (-и), заданные параметрами (-ами)/указателями (-ов) указателя. Хорошо прочитайте страницу руководства. Вы всегда должны проверять возвращаемое значение семейства 'scanf', а также диапазон значений, представляющих интерес. –

+0

Итак, я должен добавить чек, чтобы узнать, возвращает ли fscanf <0 item (s), а если нет, то он прочитал бы пустую строку и для этого EOF? – Mildan

+0

@Mildan вы проверяете, возвращает ли оно количество элементов, которые вы хотели прочитать, в этом случае '1'. Если это не так, вам понадобится резервная стратегия или как другой ответ, передайте ее вызывающему, сделав ее «int readval (int * returnVal)» и, конечно, изменив аргумент 'fscanf' из' & returnVal' на 'returnVal' и вместо возврата' returnVal' вы вернете возвращаемое значение из 'fscanf'. Смущенный? Не используйте идентификаторы типа 'read' или' returnVal'. –

1

проблема заключается в том что ваша функция read не различает между успешным состоянием чтения и ошибкой. Вы должны изменить его, чтобы принять int * в качестве параметра, который записывает scanf, и функция должна возвращать что-то вроде 0 при успешной ошибке чтения и -1. Вы можете использовать возвращаемое значение scanf в качестве основы того, что возвращает ваша функция.

Кроме того, есть системный вызов с именем read, поэтому вы должны назвать его чем-то другим. И не забудьте указать fclose(file) в конце функции, иначе вы будете пропускать дескрипторы файлов.

+0

Я попробую их обоих;) – Mildan