stdio.h fscanf格式说明符

stdio.h fscanf格式说明符,c,file-io,stdio,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

我有一个文件,它要么包含两个数字,中间有可变的空格,要么只包含一个空行。我需要知道什么时候输入只是一个空行,然后不使用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);
但它总是正确地分配给这两个数字。我希望能够创建一个switch语句,根据succ是2(表示两个数字都已分配)还是0(表示空行)来执行其他逻辑

如果可能的话,我宁愿避免使用getline;似乎将iostream与stdio函数混合使用是低效的

我试过了,但没有成功,虽然从逻辑上说我认为它会成功,但没有成功

老实说,我甚至不明白为什么会有这样的事情

"%d   %d \n"
不起作用。很简单。。。扫描文件直到换行,返回完成了多少作业,就这样

%d%d\n“
无法实现操作目标,因为任何空格指令都会占用任何空格。使用
'
'\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; 
  }
}
fscanf(stream,'%d',&num)
中的
'%d'
指定使用数字前的所有前导空格,而不考虑
'\n'
'

如果代码必须使用
fscanf()

// Consume white space except \n and EOF
int consume_ws(FILE *pFile) {
  do {
    int c = fgetc(pFile);  // could use fscanf(...%c...) here
    if (c == '\n' || c == EOF) return c;
  } while (isspace(c));
  ungetc(c, pFile);  // put the char back
  return 0;
}

...
while(1) {
  int num[2];
  int i;
  for (i = 0; i < 2; i++) { 
    if (consume_ws(pFile)) {
      Handle_ScantData();  // Not enough data
      return;
    }
    if (1 != fscanf(pFile, "%d", &num[i]) {
      Handle_NonnumericData();
      return;
    }
  }
  int ch = consume_ws(pFile);
  if (ch == 0) Handle_ExtraData();

  // Else do something with the 2 numbers

  if (ch == EOF) return;
}
//使用除\n和EOF之外的空白
int consumer_ws(文件*pFile){
做{
int c=fgetc(pFile);//此处可以使用fscanf(…%c…)
如果(c='\n'| c==EOF)返回c;
}while(isspace(c));
ungetc(c,pFile);//将字符放回原处
返回0;
}
...
而(1){
int-num[2];
int i;
对于(i=0;i<2;i++){
如果(消耗_ws(pFile)){
Handle_ScantData();//数据不足
返回;
}
如果(1!=fscanf(pFile、%d、&num[i]){
Handle_NonnumericData();
返回;
}
}
int ch=消耗量(pFile);
if(ch==0)Handle_ExtraData();
//否则就用这两个数字做点什么
如果(ch==EOF)返回;
}

在C中,我建议使用<代码> fgsSd()/<代码>!然后<代码> sChanff()/<代码>或更详细的解析。不知道C++。我不知道行会用多长时间,这是第二个参数所需要的,我只是需要所有到NeXLead的,也可以使用<代码> GETCHARE()。
重复。这可能是您最好的选择。根据以下答案:,在格式说明符的末尾添加一个空格,“%d%d”@ ToMasMatthWS——一个很好的想法,但在实践中它根本不会改变程序的行为;因为我不去检测空白行。这会占用剩余的行,空行,然后恢复。