21

私はCプログラミング言語の単純なファイルスプリッター/マージプログラムに取り組んでいます。問題は、何らかの理由でfopenがNULLを返すことです。そのため、私のプログラムはfwriteステートメントでクラッシュします。これを修正するにはどうすればよいですか?

Cファイルは次のとおりです。

int SplitFile(char* filename, char* output, size_t size)
{
    char current_file_name[256];
    int file_count = 0, i = 0;
    FILE *file = fopen( filename, "rb" );
    printf("split %s into chunks of %d named\n", filename, size);

    if (!file)
       return E_BAD_SOURCE;
    else
    {
        output = (char *) malloc(size * sizeof(char));
        if (output == NULL)
            return E_NO_MEMORY;
        else
        {
            int bytes_read = 0;
            FILE *outFile;
            do
            {
                bytes_read = fread(output, sizeof(char), size, file );
                sprintf(current_file_name, "%s%04lu\n", "part", file_count++);
                outFile = fopen (current_file_name, "wb" );  // THIS RETURNS NULL
                fwrite(output, sizeof(char), bytes_read, outFile); //CRASHES ON THIS LINE
            }
            while ( bytes_read > 0 )
                ;

            //fclose(outFile);
        }
    }
    fclose(file);
    printf("...\n");
    return 0;
}
4

8 に答える 8

22

適切なことはerrno、いつfopen戻るかを確認することですNULL

あなたの問題は、ファイル名を許可しないファイルシステムに書き込もうとしていることだと推測しますが\n、それは権限の問題でもある可能性があります。

于 2011-05-13T05:43:13.723 に答える
11

以下を含む多くの理由fopenが返される可能性がありますNULL(ただし、これらに限定されません)。

  • ファイルが存在しません
  • ファイルが他のアクセスを許可しないモードで開かれている
  • ネットワークがダウンしています
  • ファイルは存在しますが、権限がありません
  • 指定した名前のファイルが存在しますが、プロセスの現在のディレクトリが予期したものではないため、相対パス名でファイルを見つけて開くことができません。

責任者を見つける方法は、コードを掘り下げることerrnoです。

ただし、この特定のエラーを解決したからといって、fopen決して返さないと想定できるわけではありませんNULL。I/O 操作を処理する場合、コードは単純に失敗を予期する必要があります。I/O 操作の成功を予測することはできず、常に失敗する可能性があります。

于 2011-05-13T06:03:32.323 に答える
0

最初の実行で書き込みの fopen は NULL を返しますか?

その間、ファイルを書き込み用に開いたままにしておくが、ファイルを閉じないことに気付きました。

fwrite の後に fclose(outFile) を追加してみてください:

outFile =  fopen ( current_file_name , "wb" );    
fwrite(output, sizeof( char ), bytes_read, outFile); 
fclose(outFile)

OS が許可するよりも多くのファイルを開くことができます。

于 2011-05-13T05:49:46.800 に答える