从文件写入和读取时的C文件IO额外字符

时间:2013-02-01 22:21:39

标签: c

好的,我正在写一个C程序。程序很简单,当我运行程序时,我给它一些参数Ex ./proj1猫帽蝙蝠,所以它要求我输入一个单词列表,程序给出了多少次“猫”,“帽子” “和”bat“出现在该列表中。 我的程序很棒。

Example 
./pro1 cat hat bat
cat
.

(程序识别出“。”作为输入结束)

Result:
cat:1
hat:0
bat:0

好的,所以我的程序在我能想到的每个测试用例中都能完美运行,但我必须通过我教授所做的一系列测试。 这是该测试的代码。

char *args[] = {"./main", "cat", "hat","bat",NULL};
char *result[] = {"Looking for 3 words\n",
  "Result:\n",
  "cat:1\n",
  "hat:0\n",
  "bat:0\n"};
FILE *out;
FILE *test;
test=fopen("test","w");
int i;
char *buffer=malloc(100*sizeof(char));

out = fopen("smp0.in", "w");
fprintf(out, "cat\n");
fprintf(out, ".\n");
fclose(out);

freopen("smp0.in", "r", stdin);


freopen("smp0.out", "w", stdout);

quit_if(main(4, args) != EXIT_SUCCESS);

fclose(stdin);
fclose(stdout);

out = fopen("smp0.out", "r");


for (i = 0; i < 5; i++) {
    quit_if(fgets(buffer, 100, out) == NULL);
    quit_if(strcmp(buffer, result[i]));
}


fclose(out);
return EXIT_SUCCESS;
 }

好的,所以发送quit_if()是使其失败的方法。特别是

   quit_if(strcmp(buffer, result[i]));

我运行程序时的输出完全如上所述。但是在freopen()将stdout转移到文件然后再读回来之间它已经发生了某种变化。

  Result:
  cat:1
  hat:0
  batÿ:0

是输出的结果,但它不像文件写入和读取之前那样,并且由于某种原因,它总是那个奇怪的y字符。

任何建议都将不胜感激。 很抱歉没有发布更多代码,但这是因为它是一个学校项目。 我确信这是在某种程度上错误的测试,而不是我的代码,修复测试也是项目的一部分。

1 个答案:

答案 0 :(得分:2)

请参阅上一个问题的答案:

https://stackoverflow.com/a/4906442/2009431

似乎当从stdin文件中读回点时,它附加了一个EOF标记(有意义),通常不会成为用户输入的一部分。然后,不知何故(不确定,因为我们看不到你的代码)你的main()函数将这个EOF字符以怪异的y字符的形式附加到“bat”(有关原因的详细信息,请参阅链接的答案)。

如果我是对的,也许这可能被视为测试中的错误?