我有一部分 C 代码如下,它是在 linux gcc 环境中编译的。
在我的项目中,当读取从不同操作系统创建的 txt 文件时,我必须处理所有 CRLF、CR 和 LF。
我不确定 fscanf() 是否会自动处理所有情况。
有没有其他方法可以处理所有情况?
while (fscanf(fp, "%d", &data) != EOF)
{
printf("%d\n", data);
}
在读取从不同操作系统创建的 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 种情况,其中一些可能与预期的系统相关的行尾不对应。