【问题标题】:C file read by line up to a custom delimiterC 文件按行读取到自定义分隔符
【发布时间】:2010-11-16 00:29:40
【问题描述】:

C 中是否有一个函数可以读取带有自定义分隔符(如 '\n')的文件?

例如:我有:

我确实在文件中写了\n来举例说明是LF(换行,'\n',0x0A)

this is the firstline\n this is the second line\n

我希望文件按部分读取并将其拆分为两个字符串:

this is the firstline\n
this is the second line\n

我知道 fgets 我最多可以读取多个字符,但不能以任何模式读取。在 C++ 中我知道有一种方法,但在 C 中怎么做呢?

我再举一个例子:

我正在读取一个文件 ABC.txt

abc\n
def\n
ghi\n

使用以下代码:

FILE* fp = fopen("ABC.txt", "rt");
const int lineSz = 300;
char line[lineSz];
char* res = fgets(line, lineSz, fp); // the res is filled with abc\ndef\nghi\n
fclose(fp);

我预计 fgets 必须在 abc 上停止\n

但是res里面填的是:abc\ndef\nghi\n

已解决:问题是我在 WindowsXP 中使用 Notepad++(我使用的那个 我不知道它是否发生在其他窗口上)以不同的方式保存了文件 编码。

fgets 上的换行符在您键入时需要 CRLF 而不仅仅是 CR 在记事本++中输入

我打开了 Windows 记事本,它工作 fgets 读取字符串 在第二个示例中最多为 abc\n。

【问题讨论】:

  • \n 是指实际的换行符,还是字符反斜杠和 n?它不是标准的 C,但 POSIX 2008 具有 GNU getdelim 函数,可以满足您的需求。
  • fgets 准确读取一行,到第一个 \n 字符。它唯一的限制是保留缓冲区的大小。
  • 你确定吗?我做了一个程序,它读取了文本的\n,我再检查一遍。
  • @okami:您介意提供另一个没有类似 C 转义序列的示例吗?只需使用普通文本。这会让你的问题更清楚。
  • 是的,它是用 fgets 写入缓冲区的:-/

标签: c file delimiter


【解决方案1】:

fgets() 将一次读取一行,并在行输出缓冲区中包含换行符。这是一个常见用法的示例。

#include <stdio.h>
#include <string.h>
int main()
{
    char buf[1024];
    while ( fgets(buf,1024,stdin) )
        printf("read a line %lu characters long:\n  %s", strlen(buf), buf);
    return 0;
}

但既然您询问了使用“自定义”分隔符...getdelim() 允许您指定不同的行尾分隔符。

【讨论】:

  • 不,我没有询问任何自定义分隔符。如果我少于 1024(在您的示例中)并且我在位置 200 上有一个换行符,缓冲区是否会被填充到这个换行符为止?
  • @okami 是的。如果实际问题是“如何摆脱它”,请尝试 buff[strlen(buff) - 1] = '\0' 。您可能还需要检查字符串是否实际包含它。
  • ruslik 这不是我发生的事情,看看我的第二个例子(我编辑了问题)。
  • @okami 啊哈!你不明白的是 '\n' 实际上是指“换行符”(ASCII 码为 0xA 或 0xD),而不是两个字符的序列: \ 和 n 。
  • Ruslik 我知道换行符它是'\n',我确定文件中是换行符我按回车键没有在文件写入时输入\n
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多