i有一部分c代码,如下所示,在Linux GCC环境中遵守。
在我的项目中,我必须处理所有CRLF,CR和LF,读取从不同OS创建的TXT文件时。
我不确定fscanf()是否会自动处理所有情况。
还有其他方法可以处理所有情况吗?
while (fscanf(fp, "%d", &data) != EOF)
{
printf("%dn", data);
}
读取从不同OS创建的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 = ' ';
if ((ch == EOF) && (no_input || !feof(fp))) return NULL;
return org;
}
my_fgets(buffer, sizeof buffer, fp);
sscanf(buffer, ...);
这将处理大多数情况,如果文件以二进制或文本模式打开。
依靠文本模式和与系统相关的线路结束翻译不足,因为代码需要处理至少3个情况,其中一些情况可能与预期的系统依赖性线路结束不符。