3

テキストファイルを読み取り、その内容を別のファイル名で別のテキストファイルに書き込む関数を次のように記述しました。

ファイル読み取り機能:

char *getFileContent (const char *fileName)
{
char errorBuffer[50];

//Prepare read file
FILE *pReadFile;
long bufferReadSize;
char *bufferReadFile; //This variable is going to be returned as file content
size_t readFileSize;

pReadFile = fopen (fileName, "rb");

if (pReadFile != NULL)
{
    // Get file size.
    fseek (pReadFile , 0 , SEEK_END);
    bufferReadSize = ftell (pReadFile);
    rewind (pReadFile);

    // Allocate RAM to contain the whole file:
    bufferReadFile = (char*) malloc (sizeof(char) * bufferReadSize);

    if (bufferReadFile != NULL) 
    {
        // Copy the file into the buffer:
        readFileSize = fread (bufferReadFile, sizeof(char), bufferReadSize, pReadFile);

        if (readFileSize == bufferReadSize) 
        {
            return bufferReadFile;

            fclose (pReadFile);
            free (bufferReadFile);
        } else {
            //fread failed              
            sprintf (errorBuffer, "File reading failed for file:\n%s", fileName);
            MessageBox (NULL, errorBuffer, "Error file reading", MB_ICONERROR | MB_OK);
        }
    } else {
        //malloc failed
        sprintf (errorBuffer, "Memory allocation failed for file:\n%s", fileName);
        MessageBox (NULL, errorBuffer, "Error memory allocation", MB_ICONERROR | MB_OK);
    }       
} else {
    //fopen failed
    sprintf (errorBuffer, "File opening failed for file:\n%s", fileName);
    MessageBox (NULL, errorBuffer, "Error file opening", MB_ICONERROR | MB_OK);
}
}

書き込みファイル コード:

//Get file content from read file
char *fileContent = getFileContent (readFileName);
FILE *pWriteFile = fopen (writeFileName, "wb");
fwrite (fileContent, sizeof (char), strlen (fileContent), pWriteFile);
fclose (pWriteFile);

それらは正常に連携してファイルの読み取りと書き込みを行います。しかし、書かれたファイルでは、その最後に次のような奇妙な文字が出てきます。

ýýýý««««««««îþîþîþ

この問題を解決するのを手伝ってください。元のファイルにはなかった最後の奇妙な文字が書き込まれたファイルに含まれないようにするにはどうすればよいですか?

4

1 に答える 1

3
fwrite (fileContent, sizeof (char), strlen (fileContent), pWriteFile);

strlen() は、fileContent にバイナリ データが含まれているため、ここでは機能しません。バイナリ データには、strlen() が短すぎることを意味する null バイトが含まれている可能性があります。または、 () が null バイトを見つけるまでstrlen過去に読み取られることを意味する null バイトが含まれていない可能性があります。fileContentこれが、最後にゴミが表示される理由です。

また、読み取りルーチンでは、fclose() と() はステートメントfreeの後に来るため、決して発生しないことに注意してください。ただし、データを書き込むまでデータを ()returnできないことに注意してください。free

一方、バイナリ ファイルでない場合は、データの末尾に 0 を付けるだけで、strlen() が機能します。したがって、読み取りでは、別のバイトを割り当て、バイトがゼロであることを確認する必要があります。

bufferReadFile = (char*) malloc (sizeof(char) * bufferReadSize + 1); // note the + 1
bufferReadFile[bufferReadSize] = 0; // the terminating null byte.
于 2013-09-19T03:38:51.377 に答える