如何使用fscanf,关心endofline?
How to use fscanf, care about endofline?
我想从文件中读取 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
您需要使用 fgets
将每一行读入字符缓冲区,并使用其自己的 sscanf
解析每一行。您可以在格式字符串的末尾使用额外的 %s
(以及指向 char *
类型的虚拟变量的额外指针参数)来检测该行是否在您正在查找的字段之后包含额外的内容对于.
fscanf(FILE, "%d", ...);
首先扫描并丢弃白色 space,然后再扫描 int
个字符。在扫描white-space时,' '
和'\n'
都是一样的,所以使用'%d'
会丢失行尾。
fscanf(FILE, "\n", ...);
和fscanf(FILE, " ", ...);
做同样的事情:扫描并丢弃任何白色space。使用“\n” not 只扫描 '\n'
.
代码可以使用 fscanf(FILE, "%d%*1[\n]%d %d", &a, &b, &c) == 3
,在 a
之后找到 '\n'
,但其他 '\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;
}
我想从文件中读取 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
您需要使用 fgets
将每一行读入字符缓冲区,并使用其自己的 sscanf
解析每一行。您可以在格式字符串的末尾使用额外的 %s
(以及指向 char *
类型的虚拟变量的额外指针参数)来检测该行是否在您正在查找的字段之后包含额外的内容对于.
fscanf(FILE, "%d", ...);
首先扫描并丢弃白色 space,然后再扫描 int
个字符。在扫描white-space时,' '
和'\n'
都是一样的,所以使用'%d'
会丢失行尾。
fscanf(FILE, "\n", ...);
和fscanf(FILE, " ", ...);
做同样的事情:扫描并丢弃任何白色space。使用“\n” not 只扫描 '\n'
.
代码可以使用 fscanf(FILE, "%d%*1[\n]%d %d", &a, &b, &c) == 3
,在 a
之后找到 '\n'
,但其他 '\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;
}