-1

以前に作成したプログラムで2つのファイルを読み込もうとしていますが、常に失敗します。

char line[BUFSIZ];
FILE *fp2=freopen("source.dat","r");

if(fp2==NULL)
printf("Problm opening: source.dat");

FILE *fp3=freopen("result.dat", "r");

if(fp3==NULL)
printf("Problm opening: result.dat");
char line2[BUFSIZ];
int len;

while( (fgets(line2, BUFSIZ, fp2) != NULL) && (fgets(line, BUFSIZ, fp3) != NULL)) {
len=strlen(line);
if( line[len - 1] == '\n' ) line[len-1] = '\0'; len=strlen(line2);
if( line2[len - 1] == '\n' ) line2[len-1] = '\0';

rename(line, line2);
}

理由はわかりません。プログラムが開きたい2つのファイルを書き込むことはわかっています。whileループを通過しません。

4

2 に答える 2

0

このコードは私のために機能し、特に明記されている場合を除いて、明らかにあなたと同じように動作するはずです。

最初のメモは明らかに正しいものでした:-)

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

int main(void)
{
       char line[2][BUFSIZ];
       FILE *fp[2];
       char *file[2] = { "source.dat", "result.dat" };
       int  f, finished = 0;

       // Any pointers to source and result must be flushed and closed at this point,
       // i.e. if this same program has created the files, it must now close them.

       for (f = 0; f < 2; f++)
       {
           if (NULL == (fp[f] = fopen(file[f],"r")))
           {
               fprintf(stderr, "Error opening %s\n", file[f]);
               exit(-1);
           }
       }

       while(!finished)
       {
           int len;
           for (f = 0; f < 2 && (!finished); f++)
           {
               if (NULL == fgets(line[f], BUFSIZ, fp[f]))
               {
                   fprintf(stderr, "NULL on %s\n", file[f]);
                   finished = 1;
                   break;
               }
               if (feof(fp[f]))
               {
                   fprintf(stderr, "end of %s\n", file[f]);
                   finished = 1;
                   break;
               }
               len = strlen(line[f]);

               // if one of the file contains an empty line, program might crash
               if (0 == len)
               {
                   fprintf(stderr, "empty line in %s\n", file[f]);
                   finished = 1;
                   break;
               }
               if ('\n' == line[f][len-1])
                   line[f][len-1] = 0x0;
           }
           if (finished)
              break;
           fprintf(stderr, "Rename(%s, %s)\n", line[0], line[1]);
           // rename(line, line2);
      }
      for (f = 0; f < 2; f++)
         fclose(fp[f]);

      return 0;
}
于 2013-02-07T00:01:03.780 に答える
0

freopenFILEファイル名、モード、ストリームオブジェクトの3つの引数を取ります。したがって、ファイルを再度開くには、ファイルがすでに開いている必要があります。最初の呼び出しとしてを呼び出すfreopenと、ランタイムは初期化されていないアクセスの例外をスローする可能性があります。

以下のようにコードを変更する

    fp2 = fopen("source.dat", "r");
    fp3 = fopen("result.dat", "r");

私は問題なくコードを実行することができ、制御はwhileループを超えて続行されます。最初のファイルに保存されているファイルは、2番目のファイルに保存されている名前に名前が変更されます。これは、プログラムの目的であると思います。

于 2013-02-07T00:01:28.923 に答える