1

在 GNU/Linux 下,使用以下文件 'foo.csv'(当然\r是 Mac 回车):

0,1,2,3\r
4,5,6,7\r
6,9,10,11\r

fgets函数将整个文件作为一行返回。如何指定fgets应将 \r 处理为换行符?

C 代码示例:

#include <stdio.h>

int main(int argc, char **argv) {
        FILE *stream = fopen(argv[1],"r");
        char tmp[1024];
        int i=0;
        while (fgets (tmp, 1024, stream) != NULL) {
                printf("line %d\n", i);
                i++;
        }
}

我想避免通过转换\r => \n

4

2 回答 2

2

也许getdelim按照本页所述使用: http ://www.gnu.org/software/libc/manual/html_node/Line-Input.html

请注意getdelim(and getline) 与 fgets 的工作方式不同,因此您需要稍微更改代码 - 特别是,您需要以char *ptr = NULLand开头size = 0;然后将它们传递为getdelim(&ptr, &size, '\r', stream);- 当你读完整个文件时,调用free(ptr);.

编辑:要找出文件结尾的行:

int lineending(FILE *f)
{
    int ch;
    long fpos = ftell(f);
    while((ch = fgetc(f)) != EOF)
        if (ch == '\r' || ch == '\n')
            break;
    fseek(f, fpos, CUR_BEGIN);
    return ch;
}

你去吧。

于 2012-12-26T15:00:11.650 回答
1

在 Linux 和 OSX 上,您都可以调用getdelim,它允许您指定分隔符。

于 2012-12-26T14:56:54.430 回答