gpt4 book ai didi

C - 使用 fopen、fclose、fputc 等

转载 作者:太空宇宙 更新时间:2023-11-04 01:39:17 25 4
gpt4 key购买 nike

虽然我设计代码时的概念是它可以处理无限数量的文件,但我终于在我的命令行上使用了一个参数,即它可以使用一个文件。它所做的是获取一些包含由空格分隔的单词的文本文件,并用 \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(因此它可能会打印一个垃圾字符,通常是 ÿ,带分音符的拉丁文小写字母 Y,U+00FF)。
  • 如果您的 char 类型是无符号的,您永远不会看到 EOF。
  • 如果您的 char 类型是有符号的,一些有效字符(通常又是 ÿ)将被误解为 EOF。

I still can't seem to get it working for multiple arguments though.

问题是你运行的双循环:

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 循环。

关于C - 使用 fopen、fclose、fputc 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8650491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com