fscanf无法按预期读取文件

时间:2015-05-01 16:33:51

标签: c scanf

我有一些代码,我试图从文件中读取一个clique实例。实例文件中的第一行和第二行分别表示顶点和边的数量。但是我的代码似乎没有正确读取。这是我的代码中与问题相关的部分:

int num_edges=0;
int num_vertices=0;

char *clique_file = "cliqueinstance";
char *mono_file= "monotone2sat";

FILE* fp_input = fopen(clique_file, "r");
FILE* fp_output = fopen(mono_file, "w");

if (fp_input == 0 )
{
    printf( "Could not open input file\n" );
    return 0;
}

if (fp_output == 0 )
{
    printf( "Could not open output file\n" );
    return 0;
}

fscanf(fp_input, "%d ", &num_vertices);
fscanf(fp_input, "%d ", &num_edges);

printf("\n num of vertices = %d, num of edges = %d ", num_vertices, num_edges); fflush(stdout);

我的clique实例文件如下所示:

12
50
<5,1>
etc.

我希望我的代码读取12作为顶点数,50作为边数,但是当我打印出它读取的内容时,两个值都是0.。

我不确定为什么会这样,有什么想法?

我的问题更新:

我的实际计划是一系列减少。问题P1减少到问题P2,问题P2减少到问题P3,依此类推。我有四个减少,每个减少表示不同的功能。在我的main函数中,我按顺序调用这四个函数中的每一个。在每个函数中,我打开一个输入文件并将我的解决方案写入输出文件,然后输出文件是下一个减少的输入文件,依此类推。

我注意到如果我将main函数限制为单个函数,那么我可以按预期从文件中读取。为此,我依次注释掉对其他函数的调用,重新编译等。但是,如果我有多个函数调用未注释,则它不会按预期从文件中读取。这与fscanf / fgets的工作方式有关吗?缓冲区在下次函数调用中使用之前是否未被清除?任何想法/想法都将不胜感激。

3 个答案:

答案 0 :(得分:1)

我弄清楚为什么我无法按预期读取文件。在功能结束时关闭文件我并不小心。在我的程序中,我有一系列步骤,其中步骤的输出文件是下一步的输入文件,依此类推。当我确保在每个步骤结束时,我用fclose()关闭文件,我的程序按预期读取所有文件。谢谢!

答案 1 :(得分:0)

%d来电中fscanf之后删除结尾空格。

fscanf(fp_input, "%d", &num_vertices);
fscanf(fp_input, "%d", &num_edges);

如果在%d之后放置fscanf之后的空格,则第二个空格将不会读取数字,除非第一个的尾随空格已被消耗(通过读取空格{ {1}}或标签)。

答案 2 :(得分:0)

我使用包含

的文件运行发布的代码
12
20

使用以下功能:(仅修改为使其成为完整功能)

#include <stdio.h>

int main( void ) 
{
    int num_edges=0;
    int num_vertices=0;

    char *clique_file = "cliqueinstance";
    char *mono_file= "monotone2sat";

    FILE* fp_input = fopen(clique_file, "r");
    FILE* fp_output = fopen(mono_file, "w");

    if (fp_input == 0 )
    {
        printf( "Could not open input file\n" );
        return 0;
    }

    if (fp_output == 0 )
    {
        printf( "Could not open output file\n" );
        return 0;
    }

    fscanf(fp_input, "%d ", &num_vertices);
    fscanf(fp_input, "%d ", &num_edges);

    printf("\n num of vertices = %d, num of edges = %d ", 
        num_vertices, 
        num_edges); 
    fflush(stdout);
    getchar();
    return(0);      
}

结果是:

num of vertices = 12, num of edges = 20

可能是输入文件实际上是二进制文件而不是文本文件