0

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

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

4

1 回答 1

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);
于 2013-11-07T11:10:11.033 回答