我正在读取列表中每一对的键和值,忽略空格并尝试打印它。我的文件包含以下数据:
(2, 50) (4, 30) (9, 30) (10, 400) (-5, -40)
(7, 20) (19, 200) (20, 50) (-18, -200) (-2, 29)
(2, 67) (4, 35) (9, 45) (-18, 100)
我试图逐一地获取括号内的整数。例如。
m=2
n=50
m=4
n=30
我试图从文件中读取数据,直到文件结束。扫描并打印m和n值。
int m,n;
FILE* file = fopen("File1.txt", "r"); // open a file
while (!feof (file))
{
fscanf (file, "(%d, %d)", &m, &n);
printf("m is %d:", m);
printf("n is %d:", n);
}
//close the file after opening
fclose (file);
运行代码时构建成功,而
m is 2:n is 50:m is 2:n is 50:m is 2:n is 50:m is 2:n is 50:m is 2:n is 50:m is 2:n is 50:m is 2:
不断打印,而不是从文件中读取整数。
请帮助。
答案 0 :(得分:3)
我看到的错误:首先是对feof
的滥用,其次是输入卡在了第二个'('
上,输入数据中实际上存在空格。您可以通过在格式说明符中添加空格来过滤掉(空白)空格。另外,您应该始终检查文件是否已打开。
#include <stdio.h>
int main()
{
int m,n;
FILE* file = fopen("File1.txt", "r");
if(file == NULL) {
return 1; // error checking
}
while (fscanf (file, " (%d,%d)", &m, &n) == 2) // check for number of conversions
// space added here ^ ^ the space here was unnecessary
{
printf("m=%d, n=%d\n", m, n);
}
fclose(file);
return 0;
}
程序输出:
m=2, n=50 m=4, n=30 m=9, n=30 m=10, n=400 m=-5, n=-40 m=7, n=20 m=19, n=200 m=20, n=50 m=-18, n=-200 m=-2, n=29 m=2, n=67 m=4, n=35 m=9, n=45 m=-18, n=100
因为feof
检测到是否有先前尝试读取文件末尾之外的内容(您不这样做),所以从未满足结束条件。
fscanf (file, " (%d ,%d )", &m, &n)
现在每个括号和逗号前面都有一个空格,格式为字符串。每个%d
之前不需要有空格,因为该格式规范会自动过滤掉开头的空格。对于诸如
" ( 4 , 30 ) "
答案 1 :(得分:0)
还在循环中添加空间
int m,n;
FILE* file = fopen("file1.txt", "r"); // open a file
while(fscanf (file, "(%d, %d)", &m, &n)==2 || fscanf (file, "(%d, %d) ", &m, &n)==2 ||fscanf (file, " (%d, %d)", &m, &n)==2)
{
printf("m is %d:\n", m);
printf("n is %d:\n", n);
}
//close the file after opening
fclose (file);
或者
int m,n;
char ch;
FILE* file = fopen("file1.txt", "r"); // open a file
while (!feof (file))
{
fscanf (file, "(%d, %d)", &m, &n);
printf("m is %d:\n", m);
printf("n is %d:\n\n", n);
while((ch = fgetc(file)) != EOF)
if(ch == ' ')
break;
}
//close the file after opening
fclose (file);
编辑:要回答评论。
EDIT2 :修改了正则表达式以避免空格和行尾
%* c 可以添加此转义序列以避免多个字符。这类似于在scanf期间使用正则表达式。
while(fscanf (file, "(%d%*c%d%*[) \n]", &m, &n)==2)
{
printf("m is %d:\n", m);
printf("n is %d:\n", n);
}