在GNU / Linux下获取fgetc来处理Mac OS CR

时间:2012-12-26 14:52:39

标签: c linux macos

在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 =&gt; \ n

2 个答案:

答案 0 :(得分:2)

也许如本页所述使用getdelimhttp://www.gnu.org/software/libc/manual/html_node/Line-Input.html

请注意,getdelim(和getline)与fgets的工作方式不同,因此您需要稍微更改一下代码 - 特别是,您需要从char *ptr = NULL开始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;
}

你去吧。

答案 1 :(得分:1)

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