为什么额外的字符出现在文本文件中?

时间:2013-11-07 10:42:22

标签: c file visual-c++

我有一个文件,例如以下(十六进制)。

1F 00 48 3A 18 00 00 00 53 00 70 00 6F 00 75 00 
73 00 65 00 5F 00 61 00 7A 00 61 00 6D 00 00 00

我正在尝试从文件中读取二进制数据并将其作为文本输出。我目前的代码如下:

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

int main()
{
    FILE *pFile, *tempFile;
    pFile = fopen("C:\\wab files\\Admin.wab", "rb");
    if(pFile == NULL)
    {
        fputs("file error", stderr);
        exit(1);
    }
    tempFile = fopen("C:\\myfile.text","wb");
    if(tempFile == NULL)
    {
        fputs("file not open", stderr);
        exit(2);
    }
    int Contact_Id, Id_Size, Data_Info=0;
    fread(&Contact_Id, 1, 4, pFile);
    fread(&Id_Size, 1, 4, pFile);  
    Data_Info = Id_Size;
    char* Main_buffer = (char*)malloc(Data_Info*sizeof(Data_Info));
    fread(Main_buffer, 1, Id_Size, pFile);
    const wchar_t* src =   (unsigned short *) Main_buffer;
    wcstombs ((char*) Main_buffer,  src, Data_Info );
    fwrite(Main_buffer, 1, Data_Info, tempFile);
    free(Main_buffer);
    return 0;
 }

输出文本文件包含:

Spouse_azam _ a z a m

为什么_ a z a m显示在文本文件中?我只想写Spouse_azam

1 个答案:

答案 0 :(得分:1)

首先,这是错误的:

char* Main_buffer = (char*)malloc(Data_Info*sizeof(Data_Info));

应该是

char* Main_buffer = (char*)malloc(Data_Info*sizeof(char));

其次,您对源和目标使用相同的缓冲区(Main_buffer)。结果是缓冲区的第一部分被转换后的字符串覆盖,但缓冲区的其余部分保持不变。最初在缓冲区中有24个字节(如果分配正确),前11个被覆盖,但其他13个都被保留。

有两种选择:对多字节字符串使用第二个缓冲区,或使用wcstombs的返回值来知道结果字符串有多少字节:

int bytes = wcstombs ((char*) Main_buffer,  src, Data_Info );
fwrite(Main_buffer, 1, bytes, tempFile);