【问题标题】:Best way to read this file while ignoring the new line character在忽略换行符的情况下读取此文件的最佳方法
【发布时间】:2020-04-11 11:29:06
【问题描述】:

这是我要阅读的文件。

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 的宏,它只检查它们是否相等(希望不打印它)。

请找到附加的宏。

提前致谢,任何帮助都很棒。 :)

【问题讨论】:

  • 您只读取 6 个字符 + 空终止符。您的行包含换行符,因此在您再次调用 fgets 之前您不会得到它。为您的线路留出更多空间。
  • 改了也没有用。我之前已经尝试过。

标签: c file parsing file-io newline


【解决方案1】:

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

你不应该像这样使用feofthis post 解释了原因。将文件读取到最后的安全方法是在 while 循环中使用 fgets 作为停止条件。

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

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的详细信息,即换行符消耗的问题。

【讨论】:

  • 这或多或少是我要写的答案。我只是建议提及\r(所以也使用strcspn),以确保在Windows上也有预期的输出(另见stackoverflow.com/q/12769289/11336762)。
  • @RobertoCaboni,我在答案中添加了您的好建议,如果您愿意,以后可以随时改进我的帖子。
【解决方案2】:

stdio.h 中有 getline 函数,它读取行直到分隔符。虽然它是一个 POSIX,所以如果你在 Windows 上,你可能会缺少它。

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

【讨论】:

  • 所以你最好的办法是写一些类似的东西(即逐个字符读取,直到找到'\n')
猜你喜欢
  • 2012-09-01
  • 2010-10-07
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
相关资源
最近更新 更多