有没有一种方法可以读取C中括号内用逗号分隔的2个整数,而忽略空格

时间:2019-03-27 09:01:28

标签: c

我正在读取列表中每一对的键和值,忽略空格并尝试打印它。我的文件包含以下数据:

(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:

不断打印,而不是从文件中读取整数。

请帮助。

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);
}