我有一些代码,我试图从文件中读取一个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的工作方式有关吗?缓冲区在下次函数调用中使用之前是否未被清除?任何想法/想法都将不胜感激。
答案 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
可能是输入文件实际上是二进制文件而不是文本文件