无法使用c在文件中写入二进制数据

时间:2013-06-23 07:14:23

标签: c++ c visual-studio-2010 msdn

我在windows vista os中使用vs2010问题是我想读取和exe文件加密并存储它但是当我写回数据时没有插入任何内容我意味着文件已创建但没有错误和文件是空的,我已经完成了一千次并且它可以在eclipse上工作但不在vs2010上,我需要将它移植到一个gui中,任何人都可以将我重定向到我错的地方

FILE *pFile, *file;
size_t result;

pFile = fopen(fName, "r+b");
if (pFile==NULL) {MessageBox(NULL, L"Could not open file", L"Information", MB_ICONERROR); return FALSE;}

fseek(pFile, 0 ,SEEK_END);
sData->fSize = ftell(pFile);
rewind(pFile);

sData->fbuffer = (unsigned char *) malloc(sizeof(char) * sData->fSize);
if (sData->fbuffer == NULL) {MessageBox(NULL, L"Memory error", L"Information", MB_ICONERROR); fclose(pFile); return FALSE;}

file = fopen("out.txt", "w+b");
while ((result = fread(sData->fbuffer, 1, sData->fSize, file)) > 0) {
    if (!(fwrite(sData->fbuffer, 1, result, file))) {
        MessageBox(NULL, L"Write error", L"Information", MB_ICONERROR);
    }
    fclose(file);
}
fclose(file);

//result = fread(sData->fbuffer, 1, sData->fSize, pFile);
//if (result != sData->fSize) {MessageBox(NULL, L"Read error", L"Information", MB_ICONERROR); fclose(pFile); return FALSE;}

fclose (pFile);

return TRUE;

修改

我真的很抱歉问题是文件的位置是unicode格式,因为fopen接受ascii而且该位置只显示C我必须转换它以获得正确的结果谢谢

3 个答案:

答案 0 :(得分:1)

您希望在pFile中使用file代替fread()

//----------------------------------------------------  pFile not file
while ((result = fread(sData->fbuffer, 1, sData->fSize, pFile)) > 0) {
    if (!(fwrite(sData->fbuffer, 1, result, file))) {
        MessageBox(NULL, L"Write error", L"Information", MB_ICONERROR);
    }
    fclose(file);
}

答案 1 :(得分:0)

我认为您打开读取的文件不是Ascii,因此您假设根据char的大小计算文件大小是错误的。 如果你以字节为单位计算正确的文件大小,并读取和写入那么多字节,你应该没问题。

答案 2 :(得分:0)

您正在读取/写入同一文件。

  

while((result = fread(sData-> fbuffer,1,sData-> fSize, file ))> 0){

     

if(!(fwrite(sData-> fbuffer,1,result, file ))){

由于你刚刚打开这个文件,它什么也没读,所以也没有写任何内容。

从手册页:

w+ or wb+ or w+b
Truncate to zero length or create file for update.