Лучший способ прочитать этот файл, игнорируя символ новой строки - PullRequest
1 голос
/ 11 апреля 2020

Вот файл, который я хочу прочитать.

single
splash
single
V-Line
h-line 

Макрос для проверки, равна ли строка.

#define STR_MATCH(a,b) (strncmp((a),(b),strlen(b)+1) == 0)

Вот то, что я использую для чтения.

void readMissilesFile(char* fileName)
{
    FILE* mFile;
    char missile[7];

    /* Open the file. */
    mFile = fopen(fileName, "r");

    if (mFile != NULL)
    {
        while (!feof(mFile))
        {
            fgets(missile, 7, mFile);
            if (!(STR_MATCH(missile, "\n")))
            {
                printf("Missile: %s", missile);
            }
        }
        fclose(mFile);
    }
    else
    {
        perror("Could not open the file.");
    }
}

Так что у меня возникают трудности с печатью, когда я читаю строку. Я попытался проигнорировать это, убедившись, что он читает только 7 символов, что является максимальной длиной каждой ракеты. Затем я сделал макрос под названием strcmp, который просто проверяет, равны ли они (чтобы, надеюсь, не печатать его).

Пожалуйста, найдите также прикрепленный макрос.

Заранее спасибо, и любая помощь очень полезна , :)

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Если я правильно понимаю ваш вопрос, вы можете заменить символы новой строки, используя strcspn.

Вы не должны использовать feof как этот, этот пост объясняет почему Безопасный способ прочитать файл до конца - использовать fgets в качестве условия остановки в то время, как l oop.

Контейнер, missile должен быть на char больше максимального размера самой большой строки для размещения '\0'.

Живой образец

#include <string.h>
//...
char missile[10];
//...
if (mFile != NULL)
{
    while (fgets(missile, 10, mFile)) //will read till there are no more lines
    {
        missile[strcspn(missile, "\r\n")] = '\0'; //remove newline characters
        printf("Missile: %s ", missile);
    }
}
//...

Я бы посоветовал прочитать это сообщение , в котором есть подробная информация о fgets, а именно о проблеме потребления символов новой строки.

0 голосов
/ 11 апреля 2020

В stdio.h есть функция getline, которая читает строку до разделителя. Это POSIX, поэтому, если вы используете Windows, вам может не хватать его.

Вот пример реализации: https://github.com/ivanrad/getline/blob/master/getline.c

...