在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
答案 0 :(得分:2)
也许如本页所述使用getdelim
:
http://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
,它允许您指定分隔符。