0

ファイル SORTED.txt を最初に使用して閉じた後、再度開いて読み取ります - 別のファイル UNSORTED.txt のすべての内容をコピーします。UNSORTED.txt からコピーした後、コピーした行数を (コピー プロセス中ではなく、別のプロセスとして) カウントしたかったのです。2 回目は fegtc() がファイル (SORTED.txt) の先頭を指していないようです。そのため、lines の値は初期化された 0 のままです。 fgetc() を考慮して、ファイルを閉じて再度開くことなく行われましたか?

助けてくれてありがとう。

乾杯!

  f = fopen("./TEXTFILES/UNSORTED.txt", "w");
  if (f == NULL){
      printf("ERROR opening file\n");
      return 100;
  }

  for (i=0; i<1000000; i++){
    fprintf(f, "%d\n", (23*rand()-rand()/13));
  }
  fclose(f);

  f = fopen("./TEXTFILES/UNSORTED.txt", "r");
  if (f == NULL){
    return 100;
  }
  s = fopen("./TEXTFILES/SORTED.txt", "w");
  if (s == NULL){
    return 101;
  }

  while(1){
    j = getc(f);
    if (j == EOF) break;
    fputc(j, s);
  }
  fclose(f);
  //Closed source file. Read number of lines in target file.
  fclose(s);
  s = fopen("./TEXTFILES/SORTED.txt", "w");
  j = 0;

  while(1){
    j = fgetc(s);
    if (j == EOF) break;
    if (j == '\n') lines++;
  }

  fclose(s);
  printf("\n%d\n", lines);
4

2 に答える 2

3

"w"ファイルを(書き込み) モードで開いています。

s = fopen("./TEXTFILES/SORTED.txt", "w");

しかし、それから読む:

    j = fgetc(s);

あなたはおそらくそれを読み取りモードで開くつもりでした:

s = fopen("./TEXTFILES/SORTED.txt", "r");
                                    ^^^
于 2012-07-25T13:52:56.683 に答える
2

あなたはそれを理解したようですね!しかし、この例をまとめる努力をしたので、とにかく投稿することにしました。

#include <stdio.h> 

int main()
{
    FILE * f;
    FILE * s;
    int i, j;
    int lines = 0;

    f = fopen("./TEXTFILES/UNSORTED.txt", "w+");
    if (f == NULL){
        printf("ERROR opening file\n");
        return 100;
    }

    for (i=0; i<1000000; i++){
        fprintf(f, "%d\n", (23*rand()-rand()/13));
    }

    s = fopen("./TEXTFILES/SORTED.txt", "w+");
    if (s == NULL){
        fclose(f); // cleanup and close UNSORTED.txt
        return 101;
    }

    // rewind UNSORTED.txt here for reading back
    rewind( f );

    while(1){
        j = getc(f);
        if (j == EOF) break;
        fputc(j, s);
    }

    // done with UNSORTED.txt. Close it.
    fclose(f);

    // rewind SORTED.txt here for reading back
    rewind( s );
    j = 0;

    while(1){
        j = fgetc(s);
        if (j == EOF) break;
        if (j == '\n') lines++;
    }

    fclose(s);

    printf("\n%d\n", lines);

    return 0;
}
于 2012-07-25T14:21:40.490 に答える