Как удалить пустые строки из TXT-файла с помощью C, в Linux - без Bash - PullRequest
0 голосов
/ 03 июня 2019

Я пытался создать программу .c, которая при запуске берет файл и печатает только строки, в которых есть что-то (пробел, буква, число .... и т. Д.), А не пустые строки.

Мне нужно запустить это на виртуальной машине, используя Ubuntu (на ней установлена ​​новейшая версия Ubuntu). Пока мне удалось распечатать только его содержимое, но не по строкам, как в файле.

Код:

#include <stdio.h>

#include <stdlib.h>

int main(int argc, char **argv)
 {
    char *name = argv[1];

    FILE *f = fopen(name, "r");

    char x;

    while(fscanf(f, "%c" , &x) > 0)
    {
            printf("%c", x);
            if(x == '\n')
            {
                    printf("\n");
            }
    }
}

содержимое файла:

           as
           d

           3

Результаты:

           asd3

желаемый результат:

           as
           d
           3

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Вы можете использовать функцию fgets (), которая получает всю строку, включая символ новой строки (\ n). После прочтения строки вы можете пропустить печать строки, если первый символ (строка [0]) является символом новой строки .

Вот сегмент кода, который это делает. Вам нужно проверить ошибки на наличие argc и существования файла, как это сделал @David Schwartz

    char line[200];
    while (fgets(line, 100, fp))
    {
        if (line[0] != '\n')
        printf(line);
    }

Это должно работать.

0 голосов
/ 03 июня 2019

Во-первых, у вас нет проверки ошибок.Это затрудняет использование вашей программы.

Во-вторых, вы выводите каждый символ безоговорочно, а затем выводите символы новой строки в дополнительное время.То, что вы хотите сделать, это вывести каждый символ один раз, если только он не является новой строкой сразу после новой строки (как это создаст пустую строку), и в этом случае вы не хотите выводить ее.

Вот исправленный кодup:

#include <stdio.h>

#include <stdlib.h>

int main(int argc, char **argv)
 {
    if (argc < 2)
    {
         fprintf (stderr, "An argument is required\n");
         return -1;
    }

    char *name = argv[1];

    FILE *f = fopen(name, "r");
    if (f == NULL)
    {
        fprintf (stderr, "Unable to open file for reading\n");
        return -1;
    }

    char x, px = '\n';

    while(fscanf(f, "%c" , &x) > 0)
    {
            // don't output a newline after a newline
            if ((x != '\n') || (px != '\n'))
                printf("%c", x);

            // keep track of what character was before the next one
            px = x;
    }
}

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

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