【发布时间】:2015-05-01 16:33:50
【问题描述】:
我有一些代码试图从文件中读取集团实例。实例文件中的第一行和第二行分别表示顶点和边的数量。但是我的代码似乎没有正确阅读。这是我的代码中与问题相关的部分:
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);
我的集团实例文件如下所示:
12
50
<5,1>
etc.
我希望我的代码读取 12 作为顶点数和 50 作为边数,但是当我打印出它读取的内容时,这两个值都是 0。
我不知道为什么会这样,有什么想法吗?
关于我的问题的更新:
我的实际程序是一系列的缩减。问题 P1 简化为问题 P2,问题 P2 简化为问题 P3,依此类推。我有四个这样的减少,每个都用不同的功能表示。在我的主函数中,我依次调用这四个函数中的每一个。在每个函数中,我打开一个输入文件并将我的解决方案写入一个输出文件,然后该文件是下一次缩减的输入文件,依此类推。
我注意到,如果我将 main 函数限制为单个函数,那么我可以按预期从文件中读取。为此,我依次注释掉对其他函数的调用、重新编译等。但是,如果我有多个未注释的函数调用,则它不会按预期从文件中读取。这与 fscanf/fgets 的工作方式有关吗?缓冲区在下一个函数调用中使用之前是否未清除?任何想法/想法将不胜感激。
【问题讨论】:
-
fopen 返回一个指针,失败时返回NULL。虽然 0 可以“自动”转换为 NULL,但实际上与 NULL 进行比较会更好,而不是 0 此外,perror() 是报告系统函数问题的正确方法,因为它包含 errno 值, errno 消息和随附的文本字符串。程序出错退出时,不要返回0,0表示成功,建议返回stdlib.h中定义的EXIT_FAILURE
-
在调用 fscanf() 和函数族时,一定要检查返回值(不是参数值)以确保操作成功
-
一般情况下,不要在格式字符串中使用尾随空格。如果用户要输入输入,而不是来自文件,则永远不要在格式字符串中使用尾随空格。原因是格式字符串中的任何空白都会消耗任意数量的空白字符,包括换行符,直到输入非空白字符。因此,要让
scanf()返回,用户必须在提示输入接下来需要输入的内容之前输入其他字符。使用"%d"。但是,也就是说,这不是您的问题的直接原因。