我有一个文件,例如以下(十六进制)。
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
。
答案 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);