C 将输入文件的每一行打印两次?
我正在编写代码,它非常简单地读入一个文件并适当地打印出文件中的内容 我一直在努力让这样一个程序在文件结束时终止,我认为我已经找到了合适的解决方案,但是每行在我的输出中打印两次,原因我无法理解 这是我的主要文件:C 将输入文件的每一行打印两次?,c,file,while-loop,printf,C,File,While Loop,Printf,我正在编写代码,它非常简单地读入一个文件并适当地打印出文件中的内容 我一直在努力让这样一个程序在文件结束时终止,我认为我已经找到了合适的解决方案,但是每行在我的输出中打印两次,原因我无法理解 这是我的主要文件: int main(int argc, char *argv[]) { // insure 2 arguments given, one for a.out and one for the test file if (argc != 2) { // resu
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);
}
}
关键是打印两次
希望这是一个简单的错误,我只是忽略了这一问题。您可能希望:
fscanf(fp, "%c %d\n", &option, &key);
您还需要检查fscanf的返回值,以确保它等于2
在循环的第一次迭代中,换行符没有被使用
在第二次迭代中,换行符被使用并放入选项,而%d不匹配,fscanf返回1。键保持不变,这就是它再次被打印的原因
在第三次迭代中,fscanf最终返回EOF
一般规则:总是检查返回值以确保它们是您期望的。您还违反了此规则,未能检查fopen的返回。在最坏的情况下,它什么也不做;充其量,它可以帮助您调试这样的问题
#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;
}
虽然我在结束前关闭了fp,但当程序即将退出时,这并不重要,从main返回与退出相当。如果它位于main以外的函数中,那么确保释放分配的任何资源(例如文件流fp)是非常重要的
警告:未编译的代码。警告选择器。你能提供输入文件的样本吗?@JonathanLeffler:嗯,我想我说过了。我还认为向格式字符串中添加\n是修复主要错误的方法。呃..是的,我想你是这样做的;但《准则》比语言更响亮,并没有反映这一点。
#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;
}