我的文件包含两个数字,它们之间有可变的空格或只是一个空行。我需要知道输入何时只是一个空行,然后不使用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"
不行。这很简单......扫描文件直到换行,返回完成了多少作业,就是这样!
答案 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} }}
' '