fwrite似乎没有复制整个文件(只是开始)

时间:2014-02-25 08:51:02

标签: c++ file-io fopen fwrite

我正在尝试创建一个可以将任何文件读取到二进制文件的exe程序,然后使用这个二进制文件来生成完全相同的文件。

所以我发现我可以使用fopen(content,"rb")将文件读取为二进制文件, 并使用fwrite我可以将数据块写入流。但问题是当我fwrite它似乎并没有复制一切。

例如,我打开的文字中包含31231232131。当我将其写入另一个文件时,它只复制3123(前4个字节)。

我可以看到,这是一件非常简单的事情,我很遗憾,但我不知道是什么。

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

using namespace std;
typedef unsigned char BYTE;
long getFileSize(FILE *file)
{
    long lCurPos, lEndPos;
    lCurPos = ftell(file);
    fseek(file, 0, 2);
    lEndPos = ftell(file);
    fseek(file, lCurPos, 0);
    return lEndPos;
}

int main()
{
    //const char *filePath = "C:\\Documents and Settings\\Digital10\\MyDocuments\\Downloads\\123123.txt";
    const char *filePath = "C:\\Program Files\\NPKI\\yessign\\User\\008104920100809181000405,OU=HNB,OU=personal4IB,O=yessign,C=kr\\SignCert.der";


    BYTE *fileBuf;          
    FILE *file = NULL;      
    if ((file = fopen(filePath, "rb")) == NULL)
        cout << "Could not open specified file" << endl;
    else
        cout << "File opened successfully" << endl;
        long fileSize = getFileSize(file);
        fileBuf = new BYTE[fileSize];
        fread(fileBuf, fileSize, 1, file);
        FILE* fi = fopen("C:\\Documents and Settings\\Digital10\\My Documents\\Downloads\\gcc.txt","wb");
    fwrite(fileBuf,sizeof(fileBuf),1,fi);


    cin.get();
    delete[]fileBuf;
    fclose(file);
    fclose(fi);
    return 0;
}

4 个答案:

答案 0 :(得分:3)

fwrite(fileBuf,fileSize,1,fi);

您确实读过fileSize个字节,但正在编写sizeof(...)个字节,即new返回的指针大小。

答案 1 :(得分:2)

C ++方法:

#include <fstream>

int main()
{
    std::ifstream in("Source.txt");
    std::ofstream out("Destination.txt");
    out << in.rdbuf();
}

答案 2 :(得分:0)

您已交换了freadfwrite的参数。元素大小在元素数量之前。应该是这样的:

fread(fileBuf, 1, fileSize, file);

fwrite(fileBuf, 1, fileSize, fi);

另请参阅上述评论:

{}中加上else子句。缩进不会确定c ++中的块。否则,如果您无法打开文件,您的代码将会崩溃。

编辑:和另一个问题 - 你一直在写sizeof(fileBuf)个字节是不变的。相反,你应该写出你读过的完全相同的字节数。考虑到代码的其余部分,您可以简单地将sizeof(fileBuf)替换为fileSize,就像我上面所做的那样。

答案 3 :(得分:0)

        fileBuf = new BYTE[fileSize];
        fread(fileBuf, fileSize, 1, file);
        FILE* fi = fopen("C:\\Documents and Settings\\[...]\gcc.txt","wb");
    fwrite(fileBuf,sizeof(fileBuf),1,fi);

fileBuf是指向BYTE的指针。你自己宣布,看看:BYTE *fileBuf。因此sizeof(filebuf)sizeof(BYTE *)

也许你想要:

fwrite(fileBuf, fileSize, 1, fi);

与早期的fread电话密切相关。

我强烈建议您捕获I / O函数的返回值并进行检查。