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 == argc
。 while
循环将argc
递减为1,并重复。
您可以使用while
循环或for
循环,但不需要两者。
所以,要么:
for (i = i; i < argc; i++) { ...process argv[i]... }
要么:
while (--argc > 0) { ...process *++argv... }
我会使用for
循环。