Любой совет для чтения в массивах символов из текстовых файлов в C? - PullRequest
0 голосов
/ 30 апреля 2018

Вот моя проблема, с которой я сталкиваюсь.

Я читаю строки текста из файла, но пытаюсь читать только строки, которые не являются последовательными повторениями.

Вот мой обычный код для чтения в строках текста.

  while (((ch = getc (fp)) != EOF))
         {
            a[j++] = ch;
         }   
          a[j] = '\0';

, который работает просто отлично.

Пытаясь выяснить, как решить проблему, я попытался создать массив символов, который будет читать по одной строке за раз, а затем сравнить его с предыдущей строкой, используя strcomp. Если бы это было совпадение, оно не добавило бы эту строку в окончательный массив символов. Это выглядит примерно так:

  while (((ch = getc (fp)) != EOF))
        {
            if (ch != '\n')
            {
            copynumber++;
            temp[j] = ch;
            }
            else 
            {
            uni = strcmp(identical, final);
                if (uni == 0) {
                    copynumber = 0;
                }
                else 
                {
                    strncpy(identical, temp, copynumber);
                    final[j] = ch;
                }
                j++;
            }

        }
          final[j] = '\0';

но я знаю, что это не сработает по нескольким причинам. Во-первых, я никогда не добавляю предыдущие символы в окончательный массив. Я действительно просто потерян. Любая помощь приветствуется. Спасибо.

1 Ответ

0 голосов
/ 30 апреля 2018

В stdio.h есть функция getline(), которую можно использовать для получения каждой строки в файле.

Чтобы пропустить дубликаты, вы можете сохранить предыдущую строку для чтения и сравнения на каждом шаге.

FILE *fp;
char *line = NULL;
char *prev_line[999];
char final[999];
size_t len = 0;
ssize_t read;

fp = fopen("file", "r");

while ((read = getline(&line, &len, fp)) != -1) { // Read each line
    if (strncmp(line, prev_line, read) != 0) {    // If not equal
        strncat(final, line, read);                // Copy to final
        strncpy(prev_line, line, read);           // Update previous
    }
}

free(line); // Need to free line since it was null when passed to getline()
...