在GNU/Linux下,具有以下文件'foo.csv‘(当然\r是Mac回车返回):
0,1,2,3\r
4,5,6,7\r
6,9,10,11\r
fgets函数将整个文件作为一行返回。如何指定fget应该以换行符的形式处理\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++;
}
}
我想避免使用pass来转换\r => \n。
发布于 2012-12-26 15:00:11
如本页所述,可以使用getdelim
:node/Line-Input.html
请注意,getdelim
(和getline
)的工作方式与fget不同,因此您需要稍微修改代码--特别是,您需要从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;
}
这就对了。
发布于 2012-12-26 14:56:54
在Linux和OSX上,您都可以调用getdelim
,这允许您指定分隔符字符。
https://stackoverflow.com/questions/14042240
复制相似问题