如何使用stdio.h C库读取文本文件并将内容写入另一个文本文件

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);

他们成功地一起读写文件。但是,在写入的文件中,最后出现了一些奇怪的字符,就像这样:

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

请帮我解决这个问题。当原始文件中没有这些字符时,我该如何避免在写入文件的末尾出现这些奇怪的字符?


仅作为评论,在读取例程中,fclose和free从未发生,因为它们在return语句之后。 - Charlie Burns
1
如果这是一个二进制文件,你不能使用strlen()函数来确定数据的长度。你需要从读取例程中获取数据的大小。 - Charlie Burns
输入文件内容是什么?你能给我们展示一下吗? - user334856
1个回答

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

strlen()在这里不起作用,因为fileContent包含二进制数据。二进制数据可能包含空字节,这意味着strlen()会太短,或者它可能不包含空字节,这意味着strlen()会读取超过fileContent直到找到一个空字节。这就是你看到末尾垃圾的原因。

还要注意,在您的读取例程中,fclose()和free()永远不会发生,因为它们在return语句之后。但是,请注意,您不能在写入数据之前释放数据。

另一方面,如果它不是二进制文件,则只需要在数据末尾添加终止0,然后strlen()将起作用。因此,在读取时,您需要分配另一个字节并确保该字节为零:

bufferReadFile = (char*) malloc (sizeof(char) * bufferReadSize + 1); // note the + 1
bufferReadFile[bufferReadSize] = 0; // the terminating null byte.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接