我有下面的C代码的一部分,它是在linux gcc环境中编译的。
在我的项目中,读取不同操作系统创建的txt文件时,我必须处理所有CRLF,CR和LF。
我不确定fscanf()是否自动处理所有情况。
还有其他方法可以处理所有案件吗?
while (fscanf(fp, "%d", &data) != EOF)
{
printf("%d\n", data);
}
答案 0 :(得分:1)
在读取从其他操作系统创建的txt文件时处理所有CRLF,CR和LF。
我不确定
fscanf()
是否自动处理所有情况。
fscanf()
的某些用法将像fscanf(fp, "%d", &data)
一样工作,但不是全部。
一种简单的替代方法是使用自己的my_fgets()
阅读输入的行,然后调用sscanf()
。
char my_fgets(char *s, size_t sz, FILE *fp) {
if (sz < 1) {
return NULL;
}
char *org = s;
bool no_input = true;
int ch = 0;
while (--sz > 0 && (ch = fgetc(fp)) != EOF) {
no_input = false;
if (ch == '\r') {
int ch2 = fgetc(fp);
if (ch2 != '\n') ungetc(ch2, fp);
break;
}
if (ch == '\n') {
break;
}
*s++ = ch;
}
*s = '\0';
if ((ch == EOF) && (no_input || !feof(fp))) return NULL;
return org;
}
my_fgets(buffer, sizeof buffer, fp);
sscanf(buffer, ...);
如果文件以二进制或文本模式打开,这将处理大多数情况。
依靠文本模式和与系统有关的行尾翻译是不够的,因为代码需要处理至少3种情况,其中有些可能与预期的与系统有关的行尾不对应。