fgets() застревает в бесконечном цикле

Если я использую функцию fgets() для поиска определенного разделителя в текстовом файле, как мне убедиться, что fgets() не зацикливается на EOF?

Я объединяю все строки от delimiter1 до delimiter2 в struct1[i].string1, где i — n-е вхождение шаблона delimiter1/delimiter2. Этот шаблон продолжается по всему текстовому файлу до самого конца, где вместо delimiter2 есть EOF. Я также хочу объединить все от delimiter1 до EOF.

int i;
while(fgets(temp_string,100,inFile) != NULL){    
if(strcmp(temp_string,"Delimiter1")==0){ //checks to see if current line is delimiter1
        j=strcmp(temp_string,"Delimiter2");
        while(j!=0 && temp_string != NULL){ //Here I try to exit if it is the EOF
            fgets(temp_string,100,inFile);  
                 strcat(struct1[i].string1,temp_string);
                 j= strcmp(temp_string,"Delimiter2"); //update comparator           
        }
        i++;
    }

}   
}

Однако, когда я пытаюсь запустить этот код, я застреваю в бесконечном цикле. Я поместил оператор печати во внутренний цикл while, показывающий, что такое целое число «i», и оно застряло на числе 4, что является общим количеством delimiter1 в текстовом файле, что заставило меня поверить, что EOF дает мне бесконечный цикл.

Любая помощь будет оценена по достоинству.


person Sean Sen Wang    schedule 27.03.2013    source источник
comment
Разве fgets не возвращает количество полученных символов?   -  person Patashu    schedule 27.03.2013
comment
Вместо того, чтобы пытаться использовать temp_string для проверки EOF, fgets() вернет NULL при возникновении EOF/ошибки. Чтобы отличить ошибку от EOF, используйте feof.   -  person Anish Ramaswamy    schedule 27.03.2013
comment
Тип возвращаемого значения @Patashu — «char*». Вы можете использовать strlen, чтобы получить размер.   -  person CuriousSid    schedule 27.03.2013


Ответы (3)


Причина бесконечного цикла - внутренний цикл:

 while(j!=0 && temp_string != NULL){ //Here
       ^              ^ never set to NULL
       | never became 0 if  "Delimiter2" not found

Предположим, если в temp_string значение не "Delimiter2", то вы никогда не устанавливаете j = 0, а также не устанавливаете temp_string в NULL

Вы читаете в temp_string 100 символ сразу, поэтому "Delimiter2" может быть прочитано из файла с некоторыми другими чартерами, поэтому strcmp() не возвращает 0 даже при чтении "Delimiter2".

Попробуйте исправить код, напечатав temp_string.

Кроме того, вы можете использовать функцию strstr() вместо strcmp(), чтобы найти "Delimiter2" в вашем файле. strstr() возвращает действительный адрес, если "Delimiter2" найден где-либо в temp_string, иначе NULL.

person Grijesh Chauhan    schedule 27.03.2013
comment
Проблема не в обнаружении Delimiter2, а в выходе из цикла while, если достигнут конец файла. Я согласен, что проблема во внутреннем цикле. Однако способ форматирования текстового файла заключается в том, что есть '\n', который будет отображаться в каждой строке перед 100 символами, что, как я полагаю, fgets() завершается. Я просто переборщил с гибкостью. Я пытался отладить свой код с помощью printf моей temp_string, и все строки считываются и сравниваются правильно до последней строки всего файла, где temp_string заканчивается символом '\n' и бесконечно зацикливается на этом. - person Sean Sen Wang; 27.03.2013
comment
@SeanSenWang Да, возможно, это и другие ошибки. Я ответил на основе информации, которую вы предоставили в ответе. дайте мне знать, если я могу помочь вам больше в этом. - person Grijesh Chauhan; 27.03.2013

temp_string - это ваш буфер, я думаю, он предварительно выделен или находится в стеке, поэтому он не может быть NULL. Это означает, что внутренний цикл никогда не остановится.

Вы должны проверить код возврата внутреннего fgets()

person eyalm    schedule 27.03.2013

Спасибо за ваш вклад. Было указано, что во внутреннем цикле while

while(j!=0 && temp_string != NULL){

temp_string != NULL так и не был найден. изменить это на

!feof(inFile)

исправил проблему.

person Sean Sen Wang    schedule 27.03.2013