stdio.h fscanf格式说明符

时间:2015-01-31 17:32:19

标签: c file-io stdio

我的文件包含两个数字,它们之间有可变的空格或只是一个空行。我需要知道输入何时只是一个空行,然后不使用fscanf 分配给那些变量

做:

FILE *pFile = fopen (my_file, "r");
if (pFile == NULL) perror ("Error opening file");
int succ = 1, num1 = 0, num2 = 0; 
while (succ != EOF)
{
  succ = fscanf(pFile, "%d   %d", &num1, &num2);
}

非常适合正确检测所有数字,但不适用于换行符。 我试过了:

fscanf(pFile, "%d   %d %*[^\n]", &num1, &num2);

但它始终适当地分配给两个数字。我希望能够根据succ是否为2(表示两个数字都已分配)或0(表示空行)来创建一个switch语句来执行其他逻辑。

如果可能,我宁愿避免使用getline;使用与stdio函数混合的iostream东西似乎效率低下。

我试过this guys suggestion,没有成功,虽然从逻辑上说我认为它会起作用但事实并非如此。

老实说,我甚至不明白为什么会这样。

"%d   %d \n"

不行。这很简单......扫描文件直到换行,返回完成了多少作业,就是这样!

1 个答案:

答案 0 :(得分:2)

"%d %d \n"无法实现OP目标,因为任何空白空间指令都会消耗任何空白区域。使用' ''\n'没有任何区别,它们都会消耗0个或更多的空格。 (期望在'[]'说明符中)

OP希望检测到'\n'并且fscanf()不是一个好选择。 fgets()更好。

#define N (100 /* longest line */)
char buf[N];
while (fgets(buf, sizeof buf, pFile) != NULL) {
  int cnt = sscanf("%d%d",&num1, &num2);
  switch (cnt) {
     case 0: Handle_NoNumbers(); break; 
     case 1: Handle_1Number(); break; 
     case 2: Handle_Success(); break; 
  }
}

'%d'中的fscanf(stream, "%d", &num)指定在数字前使用所有前导空格,而不考虑'\n'' '等。

如果代码必须使用fscanf(),那么在调用fscanf(... "%d")之前,代码需要消耗前导空格,以区分'\n'和{{1} }}

' '