-1

关于下面的代码的几个问题,我在上一篇文章中从中获得了帮助。

1)。任何想法为什么在输出结束时,我会打印一个随机的垃圾字符?我正在释放文件等并检查 EOF。

2)。这个想法是它可以处理多个文件争论,所以我想创建增加的新文件名,即 out[i].txt,这在 C 中可能吗?

代码本身获取一个包含所有以空格分隔的单词的文件,例如一本书,然后循环遍历,并用 \n 替换每个空格,以便它形成一个列表,请找到以下代码:

#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <stdio.h>

/*
 * 
 */
int main(int argc, char** argv) {

FILE *fpIn, *fpOut;
int i;
char c;
while(argc--) {
    for(i = 1; i <= argc; i++) {
        fpIn = fopen(argv[i], "rb");
        fpOut= fopen("tmp.out", "wb");
        while (c != EOF) {
            c = fgetc(fpIn);
            if (isspace(c)) 
                c = '\n';
            fputc(c, fpOut );
        }
    }
}
fclose(fpIn);
fclose(fpOut);
return 0;
}
4

2 回答 2

2

当您到达文件末尾时,您不会break循环。因此,您调用fputc(c, fpOut);c==EOF可能是未定义的行为,或者至少是一个\0xff字节的写入。

而且您不会在循环fclose内部调用while(argc--),因此您的文件(最后一个文件除外)大多不会关闭或刷新。

最后,您不测试结果,fopen您应该测试它是否为非空(并打印一条错误消息,在这种情况下可能带有关于strerror(errno)or的内容perror)。

您应该已经使用调试器(例如gdb在 Linux 上)发现了问题,也许还借助了编译器警告(但gcc-4.6 -Wall在您的示例中没有发现任何错误)。

您可以决定输出文件名与输入文件名相关,也许与

char outname[512];
for(i = 1; i < argc; i++) {
   fpIn = fopen(argv[i], "rb");
   if (!fpIn) { perror (argv[i]); exit(1); };
   memset (outname, 0, sizeof (outname));
   snprintf (outname, sizeof(outname)-1, "%s~%d.out", argv[i], i);
   fpOut= fopen(outname, "wb");
   if (!fpOut) { perror (outname); exit(1); };
   /// etc...
   fclose(fpIn);
   fclose(fpOut);
   fpIn = fpOut = NULL;
}
于 2011-12-27T20:47:42.103 回答
1

建议的更改(所有未经测试):

#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <stdio.h>

int 
main(int argc, char** argv) {

  FILE *fpIn, *fpOut;
  int i;
  char c;
  for(i = 1; i < argc; i++) {
    fpIn = fopen(argv[i], "rb");
    if (!fpIn) {
      perror ("Unable to open input file");
      continue;
     }
    fpOut= fopen("tmp.out", "wb");
    if (!fpOut) {
      perror ("Unable to open output file");
      fclose (fpIn);
      continue;
     }
     while ((c = fgetc (fpIn)) != EOF)) {
       if (isspace(c)) 
         c = '\n';
       fputc(c, fpOut );
     }
     fclose(fpIn);
     fclose(fpOut);
  }
  return 0;
}
于 2011-12-27T20:53:43.997 回答