feof()
дает истинный результат только тогда, когда вы уже попытались прочитать и уже достигли конца файла с неудачным чтением . * * * * * * * * * * * * * * * * * * * * * * * * * * * *, Если конец файла 1013 * пытается дать вам столько байтов, сколько он может ... или ни одного вообще, единственный способ получить условие конца файла - это после того, как вам не удалось прочитать что-то . Гораздо лучше проверить результат fgets()
, так как он возвращает NULL
при невозможности что-либо прочитать сейчас. (и не в последнем прочтении), поэтому
while(fgets(buff, sizeof buff, fd) != NULL)
или просто
while(fgets(buff, sizeof buff, fd))
будет намного лучше. Также посмотрите, как я использую оператор sizeof
, чтобы использовать размер используемого буфера, вместо того, чтобы повторять (и быть подверженным ошибкам) фактическое количество байтов в двух местах. Если вы решите изменить размер буфера, вам также потребуется изменить фактическое количество байтов для чтения в вызове fgets()
, что позволит забыть об одном из них и столкнуться с проблемой.
Вы приказываете оставаться в l oop только тогда, когда !feof()
ИЛИ когда counter == 6
(во-первых, это заставит элемент управления ввести l oop когда счетчик равен 6, , несмотря на то, что вы достигли EOF или нет , это не может быть правильным) Думайте, что вы выходите из l oop только когда оба условия ложны ( это значит feof()
возвращает true , а также counter != 6
), вам лучше написать:
while(fgets(buff, sizeof buff, fd) && counter < max_number_of_iterations)
Тест
if(strcmp(buff[0],"#"))
также неверно, так как buff[0]
является символом (действительно, это первый символ, читаемый в буфере, а "#"
является строковым литералом (не символом). Возможно, вы получили по крайней мере предупреждение от компилятора, из которого вы не говорите ни слова. Вам лучше проверить оба символа на равенство, как в
if (buff[0] == '#') /* this time '#' is a character literal, not a string literal */
в строке
if (fopen == NULL)
fopen
сам по себе является указателем на библиотечную функцию fopen(3)
, что не то, что вам нужно (fopen
всегда != NULL
), но
if (fd == NULL){
(что вы делали раньше, поэтому вам лучше исключить этот код)
вы определяете char c;
, затем инициализируете его первым символом buff
, а затем вообще не используете его. Это не оказывает никакого влияния на ваш код, но это плохой стиль и мешает сопровождающим в будущем.
в строке sscanf(&buff, "%d %d", ....
вам не нужно пропускать &buff
, тогда как buff
это уже указатель на символ . Лучше передать его buff
.n Но вместо этого вам необходимо передать указатели на переменные, которые вы читаете , поэтому вам нужно исправить это в:
sscanf(buff, "%d%d", &array[counter].start, &array[counter].end);
без этого создаст Undefined Behavior , который будет трудно реализовать, так как использование неинициализированных переменных (и, более того, указателей на переменные) вначале заставит код, вероятно, работать, но потерпит неудачу, когда он попадет в производство. какое-то время ... это очень серьезная ошибка .