-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--)ため、ファイル(最後のファイルを除く)はほとんど閉じられず、フラッシュされません。

最後に、の結果をテストせず、それがnullでないことをテストする必要があります(そして、エラーメッセージを出力します。その場合は、またはfopenについての何かが含まれている可能性があります)。strerror(errno)perror

デバッガー(gdbLinuxなど)を使用して、おそらくコンパイラーの警告を使用して(ただし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 に答える