0

これは最も単純なプログラムですが、このエラーが発生しました。あるファイルから別のファイルにすべての情報をコピーします。(率直に言って、いくつかのファイルから情報をコピーする必要があります)

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

 void CopyTo(FILE *x)
 {
    FILE *f0;
    char *s=new char[100];
    f0=fopen("file0.txt","wt+");
    while(fgets(s,sizeof(s),x))
    {
        fwrite(s,1,strlen(s)+1,x);
    }
    fclose(f0);    
 };

 int main()
 {
    FILE *fi;
    fi=fopen("file1.txt","rt");
    CopyTo(fi);
    fclose(fi);
    printf("finish");
    getchar();
 }
4

2 に答える 2

3

@a1ex07 は、現在のコードの問題のいくつかに対処しました。ただし、コメントで述べたように、いくつかの重要な変更を加えることで、コードをより効果的に実装できると思います。

次の問題があると思います。

  1. ヒープにバッファーを割り当てて、それを解放できません。
  2. あなたのバッファはかなり小さいです。より大きなバッファを使用する方が効率的です。
  3. fgetsおよび、C 文字列指向関数の使用strlenは、バイトごとのコピー操作には不適切です。

私は次のように書きます:

void CopyTo(FILE *x)
{
    FILE *f0;
    char buff[16*1024];//16kB buffer, stack allocated
    size_t count;

    f0=fopen("file0.txt", "wt+");
    do
    {
        count = fread(&buff, 1, sizeof(buff), x);
        if (!ferror(x))
        {
            fwrite(&buff, 1, count, f0);
        }
    } while (count == sizeof(buff));
    fclose(f0);    
};

この関数にはエラー チェックがないことに注意してください。あなたもそうでした。必要に応じて追加します。また、これは頭の中でコンパイルしただけです。何か不具合があれば、それらを整理できると確信しています。

于 2011-11-14T20:34:12.600 に答える
1

同じファイル (x) を読み書きしようとしているようです。そうではない fwrite(s,1,strlen(s),f0)でしょうか?
UPDATEまた、( )のサイズを返すため、
そうあるべきだと思います while(fgets(s,100,x))sizeof(s)char*

于 2011-11-14T19:44:28.837 に答える