我正在编写代码,它只是简单地读入文件并打印出文件中的内容。
我总是努力让这样的程序在文件结束时终止,并且认为我找到了合适的解决方案,但是每行都在我的输出中打印两次,原因超出了我。
这是我的主要文件:
int main(int argc, char *argv[]) {
// insure 2 arguments given, one for a.out and one for the test file
if (argc != 2) {
// result if request fails
printf("Requires 2 arguments. Be sure to include test file location\n");
return 0;
}
FILE *fp; //open the file
fp = fopen(argv[1], "r");
char option;
int key;
int i = 0;
while (fscanf(fp, "%c %d", &option, &key) != EOF) {
printf("%d\n", key);
}
}
关键是打印两次!
希望这是一个简单的错误,我只是因为过度暴露问题而忽略了。
答案 0 :(得分:0)
你可能想要:
fscanf(fp, "%c %d\n", &option, &key);
并且您还想检查fscanf
的返回值,以确保它等于2.
在循环的第一次迭代中,换行没有消耗。
在第二次迭代中,新行被使用并放入option
,%d
不匹配,fscanf
返回1. key
不变,这是为什么再次打印出来。
在第三次迭代中,fscanf
最终返回EOF
。
一般规则:始终检查返回值以确保它们符合您的预期。 (你也没有检查fopen
的回复而违反了这条规则。)最糟糕的是它没有做任何事情;充其量,它可以帮助您调试这样的问题。
答案 1 :(得分:0)
#include <stdio.h>
int main(int argc, char *argv[])
{
if (argc != 2)
{
fprintf(stderr, "Requires 1 argument - a file name\n");
return 1;
}
FILE *fp; //open the file
if ((fp = fopen(argv[1], "r")) == 0)
{
fprintf(stderr, "Failed to open file %s\n", argv[1]);
return 1;
}
char option;
int key;
while (fscanf(fp, "%c %d", &option, &key) == 2)
printf("%d\n", key);
return 0;
}
请注意错误报告和文件读取过程中的更改。代码仍然可能不是你想要的;在第一行之后存储在option
中的第一行输入后的数字之后,您可能会得到换行符。修复需要fgets()
和sscanf()
:
#include <stdio.h>
int main(int argc, char *argv[])
{
if (argc != 2)
{
fprintf(stderr, "Requires 1 argument - a file name\n");
return 1;
}
FILE *fp; //open the file
if ((fp = fopen(argv[1], "r")) == 0)
{
fprintf(stderr, "Failed to open file %s\n", argv[1]);
return 1;
}
char buffer[1024];
while (fgets(buffer, sizeof(buffer), fp) != 0)
{
char option;
int key;
if (fscanf(fp, "%c %d", &option, &key) == 2)
printf("%d\n", key);
else
{
fprintf(stderr, "Format mismatch on %s", buffer);
fclose(fp); // Not 100% necessary here, but tidiness is important
return 1;
}
}
fclose(fp); // Not 100% necessary here, but tidiness is important.
return 0;
}
虽然我在结束前关闭了fp
,但在程序即将退出时并不重要,而return
的{{1}}几乎与main()
相当。如果它位于exit()
以外的函数中,则确保释放您分配的任何资源非常重要,例如文件流main()
。
警告:未编译的代码。警告Lector。