如何使用fscanf,关心endofline?

时间:2015-09-30 12:58:15

标签: c file scanf

我想从文件中读取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

2 个答案:

答案 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; 
}