Моя программа на C продолжает читать только первую строку. Я пытаюсь заставить его прочитать все содержимое текстового файла - PullRequest
0 голосов
/ 27 января 2019

У меня есть похожая программа, которая без проблем читает весь текстовый файл.Но, может быть, у меня здесь есть мой fscanf?Впервые я столкнулся с чем-то вроде этого.По сути, я сохраняю первую строку в файле в переменную и пытаюсь использовать ее, чтобы просмотреть каждую строку во втором файле и проверить, есть ли эта строка.

#define MAX_LENGTH 500
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>



int main() {

        char string1[MAX_LENGTH]; //this will each string from my first file to compare every string in the second file
        char string2[MAX_LENGTH];
        int result;

        FILE *fp1;
        FILE *fp2;
        fp1 = fopen("C:/textfile1.txt", "r");
        fp2 = fopen("C:/textfile2.txt", "r");

        if (fp1 == NULL || fp2 == NULL) {

            printf("FILE cannot be opened... exiting...");
            exit(1);

        }

        //while (1) {

            while(! feof(fp1)) { 

                fscanf(fp1, "%[^\n]s", string1); 

                while (! feof(fp2)) {

                    fscanf(fp2, "%[^\n]s", string2); 
                    result = strcmp(string1, string2);

                    if (result == 1) { 

                        printf("%s has been ADDED...\n", string1);

                    }
                }

            }

            while(! feof(fp2)) {

                fscanf(fp2, "%[^\n]s", string1);

                while (!feof(fp1)) {

                    fscanf(fp1, "%[^\n]s", string1);
                    result = strcmp(string2, string1);

                    if (result == 1) {

                        printf("%s has been REMOVED...\n", string2);
                    }
                }

            }
        //}

        getchar();
        getchar();

        return 0;

}

Ответы [ 2 ]

0 голосов
/ 27 января 2019

.. продолжает читать только первую строку.

fscanf(fp1, "%[^\n]s", string1); не читает '\n'.

Поскольку код никогда не читается '\n', он остается в файле до тех пор, пока какой-либо код его не прочитает. Последующее чтение файла не происходит.


fscanf(fp1, "%[^\n]s", string1); плохо и по другим причинам.

1) Без ограничения ширины. Чрезмерный ввод приведет к неопределенное поведение (UB). Зачастую это искажение других данных.

2) "s" не имеет смысла. Брось.

3) Возвращаемое значение fscanf() не проверено. Код не знает, что-то было написано в string1.


Альтернатива: использовать fgets().

        // Avoid
        // while(! feof(fp1)) { 
        //    fscanf(fp1, "%[^\n]s", string1); 
        //    while (! feof(fp2)) {
        //        fscanf(fp2, "%[^\n]s", string2); 

        while(fgets(string1, sizeof string1, fp1)) {
            string1[strcspn(string1, "\n")] = '\0';  // Lop off potential \n
            while(fgets(string2, sizeof string2, fp2)) {
                string2[strcspn(string2, "\n")] = '\0';
0 голосов
/ 27 января 2019

Во-первых, позвольте мне начать с того, что fscanf() не идеальная функция для того, что вы делаете, используйте fgets() или getline(), как уже заявили другие. Во-вторых, вы должны заметить, что два последних оператора while в вашей программе будут пропущены, поскольку к тому моменту, когда поток выполнения достигнет этой точки, оба потока fp2 и fp1 уже будут в EOF.

Теперь, что касается вашего вопроса, ваша проблема заключается в следующем: "%[^\n]s" Если вы хотите прочитать строку текста, завершающий 's' не нужен, и потребуется, чтобы входной поток содержал 's' после последовательности соответствует %[^\n]

Что означает шаблон %[^\n], так это «прочитать все до первого '\n', но не включая сам '\n', который останется в буфере; это не хорошо, если следующий fscanf() вызов будет читать это осталось '\n' и ничего более. Чтобы решить эту проблему, вам нужно очистить буфер, что-то вроде fscanf(fp, "%*c") должно работать. Он будет читать в запасной символ '\n', это будет необходимо сделать что после каждого звонка fscanf(). Примерно так:

        while(! feof(fp1)) { 

            fscanf(fp1, "%[^\n]", string1);
            fscanf(fp1, "%*c");

            printf("%s\n", string1);

            while (! feof(fp2)) {

                fscanf(fp2, "%[^\n]", string2);
                fscanf(fp2, "%*c");

                printf("%s\n", string2);

                result = strcmp(string1, string2);

                if (result == 1) { 

                    printf("%s has been ADDED...\n", string1);

                }
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...