我想从文件中读取int
第一行由1个int组成,第二行由2个
组成即
1
2 3
如果我这样做
fscanf(FILE, "%d \n %d %d", &a, &b, &c);
我正确获得了3个数字
但如果我把所有数字放在文件的同一行
即1 2 3
我得到了相同的结果(那不是我想要的)
我想知道:如何强制用户转到他文件中的新行?
编辑: 由于某些人似乎不清楚(我很抱歉)我想要那个文件
1
2 3
产生结果:
a = 1
b = 2
c = 3
文件
1 2 3
产生错误或
a = 1
b = 0
c = 0
答案 0 :(得分:3)
您需要使用fgets
将每一行读入char缓冲区,并使用自己的sscanf
解析每一行。您可以在格式字符串的末尾使用额外的%s
(以及类型为char *
的虚拟变量的额外指针参数)来检测该行是否包含您正在查找的字段之后的额外内容对
答案 1 :(得分:2)
fscanf(FILE, "%d", ...);
首先扫描并丢弃空格,然后再扫描int
个字符。在扫描空白区域时,' '
和'\n'
的处理方式相同,因此使用'%d'
会丢失行尾。
fscanf(FILE, "\n", ...);
和fscanf(FILE, " ", ...);
做同样的事情:扫描并丢弃任何空白区域。使用" \ n" 不只扫描'\n'
。
代码可以使用fscanf(FILE, "%d%*1[\n]%d %d", &a, &b, &c) == 3
来查找'\n'
之后的a
,但其他'\n'
可能潜伏在其他地方。
使用scanf()
系列检测'\n'
的唯一方法是使用'%c'
或'%[]'
或'%n'
。它更容易使用fgets()
,然后使用sscanf()
或strtol()
进行解析。
int Read1and2int(FILE *stream, int *a, int *b, int *c) {
char buf[100];
int n;
if (fgets(buf, sizeof buf, stream) == NULL) return EOF;
int count = sscanf(buf,"%d %n", a, &n);
// Non-numeric or extra data
if (count != 1 || buf[n]) return 0;
if (fgets(buf, sizeof buf, stream) == NULL) return 1;
count = sscanf(buf,"%d%d %n", b, c, &n);
// Non-numeric or extra data
if (count != 2 || buf[n]) return 1;
return 3;
}