忽略换行符时读取此文件的最佳方法

时间:2020-04-11 11:29:06

标签: c file parsing file-io newline

这是我要读取的文件。

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 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,则可以使用strcspn替换换行符。

您不应像这样使用feofthis post解释了原因。从头到尾读取文件的安全方法是将fgets用作while循环中的停止条件。

missile容器应比char可以容纳的最大字符串的最大大小大'\0'一个。

Live sample

#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);
    }
}
//...

我建议您阅读this post,其中包含有关fgets的详细信息,即换行字符消耗的问题。

答案 1 :(得分:0)

getline中有stdio.h函数,该函数读取行直到定界符。虽然它是POSIX,所以如果您在Windows上,可能会缺少它。

以下是示例实现: https://github.com/ivanrad/getline/blob/master/getline.c