C – 使用fopen,fclose,fputc等

我已经让这段代码最终在我的命令行上使用了一个参数,即一个文件供它使用,尽管我设计的代码的概念是使用无限数量的文件。 它的作用是使用包含以空格分隔的单词的X个文本文件,并用\n替换空格,从而创建单词列表。 虽然,它成功地完成了第一个参数,但它只是忽略了第二个参数。

另一个小问题似乎是它最后还打印出一些垃圾信,Y上面有两个点; 我假设一些EOF符号,但我似乎无法阻止这种情况发生!

 int main(int argc, char** argv) { FILE *fpIn, *fpOut; int i, j; j = 1; char c; char myString[256]; printf("%d", argc); printf("\n"); printf("The following arguments were passed to main(): "); for(i=1; i<argc; i++) printf("%s ", argv[i]); printf("\n"); while(argc--) { for(i = 1; i < argc; i++) { fpIn = fopen(argv[j], "rb"); snprintf(myString, 256, "%s~[%d]", argv[j], i); fpOut= fopen(myString, "wb"); while (c != EOF) { c = fgetc(fpIn); if (isspace(c)) c = '\n'; fputc(c, fpOut ); } j++; } } return 0; } 

getchar()getc()fgetc()函数(或宏)返回一个int ,而不是一个char

你必须使用:

 int c; while ((c = fgetc(fpIn)) != EOF) { if (isspace(c)) c = '\n'; fputc(c, fpOut); } 

想一想; 函数必须能够返回任何有效的char EOF(它与任何有效的char值不同。因此,根据定义,返回值不能是char

如果使用char会发生什么?

  • 您的原始代码在测试之前没有初始化c (因此循环可能会提前中断)。
  • 您的代码在读取EOF后没有立即测试c (因此它可能会打印出一个垃圾字符,通常是ÿ,带有DIAERESIS的LATIN SMALL LETTER,U + 00FF)。
  • 如果您的char类型未签名,则您永远不会看到EOF。
  • 如果您的char类型已签名,则某些有效字符(通常是ÿ再次)将被误解为EOF。

我仍然无法让它为多个参数工作。

问题是你运行的双循环:

 int i, j; j = 1; while (argc--) { for (i = 1; i < argc; i++) { fpIn = fopen(argv[j], "rb"); ...process fpIn... j++; } } 

我们假设您使用两个文件名调用该命令; 然后argc == 3

在第一次经过while循环之后, argc == 2 。 然后你做一个for循环, i取值1; 你打开argv[1] (因为j == 1 )。 你处理那个文件; 然后将j增加到2,然后再增加i ,也增加到2.第二次围绕for循环, i == 2和argc ,因此for循环终止。 while循环再次将argc递减为1,但测试2 != 0 。 但是, for循环设置i = 1然后终止,因为i == argcwhile循环将argc递减为1,并重复。

您可以使用while循环或for循环,但不需要两者。

所以,要么:

 for (i = i; i < argc; i++) { ...process argv[i]... } 

要么:

 while (--argc > 0) { ...process *++argv... } 

我会使用for循环。