如何使用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; 
}