二进制打开和复制图像文件c ++

时间:2016-02-24 16:42:46

标签: c++ file

我想将一个图像文件复制到另一个新文件。这是我的方法:

    std::ofstream myOutpue;
    std::ifstream mySource;
    //int i = 0;
    mySource.open(ofn.lpstrFile, std::ios::binary);
    myOutpue.open("im4.jpg", std::ios::binary);
    char buffer;
    char bufferToSave[100];
    if (mySource.is_open())
    {
        //client->sendFilePacket(FileStates::START_SAVE, buffer, false,i);
        i++;
        while (!mySource.eof())
        {
            mySource >> std::noskipws >> buffer;
            myOutpue << buffer;
            //client->sendFilePacket(FileStates::CONTINUE_SAVE, buffer, false,i);
            i++;
        }
    }
    i++;
    //client->sendFilePacket(FileStates::END_SAVE, buffer, true,i);
    mySource.close();
    //myOutpue.close();

此方法正常工作,但我的问题是我想复制char / bit并将其发送到另一个客户端。当我通过每个char执行此操作时,这不能正常工作,所以我想做一个更大的buffor(例如char t [512])或类似的东西,并将它们复制到新文件。

我尝试这样做:

    std::ofstream myOutpue;
    std::ifstream mySource;
    mySource.open(ofn.lpstrFile, std::ios::binary);
    myOutpue.open("im4.jpg", std::ios::binary);
    char buffer;
    char bufferToSave[100];
    if (mySource.is_open())
    {
        //client->sendFilePacket(FileStates::START_SAVE, buffer, false,i);
        i++;
        while (!mySource.eof())
        {
            if (i == 100)
            {
                for (int i = 0; i < 100; i++)myOutpue << bufferToSave[i];
                i = 0;
            }
            mySource >> std::noskipws >> buffer;
            bufferToSave[i] = buffer;
            //myOutpue << buffer;
            //client->sendFilePacket(FileStates::CONTINUE_SAVE, buffer, false,i);
            i++;
        }
    }
    i++;
    //client->sendFilePacket(FileStates::END_SAVE, buffer, true,i);
    mySource.close();
    myOutpue.close();

但我得到了我无法打开的形象。

所以我的问题是如何读取文件以从中获取更多位并创建与原始图像相同的图像。

5 个答案:

答案 0 :(得分:1)

原始文件复制算法中存在错误,因为您永远不应使用eof()作为结束标记循环。

请参阅:Why is iostream::eof inside a loop condition considered wrong?

复制文件可以很简单:

    std::ofstream("output.jpg", std::ios::binary) << std::ifstream("input.jpg", std::ios::binary).rdbuf();

在传递std::istream缓冲区时(使用rdbuf()),它使用输出运算符的特殊重载。它复制整个流。

阅读整个缓冲区时,您应该使用std::istream::read

    std::ifstream ifs("input.jpg", std::ios::binary)

    char buffer[1025]; // create a buffer

    // keep going as long as the reading succeeds
    while(ifs.read(buffer, sizeof(buffer)))
    {
        // ifs.gcount() is the number of chars read successfully
        client->sendFilePacket(buffer, ifs.gcount()); // send all bytes
    }

答案 1 :(得分:0)

C++ FAQ

  

你可能想使用iostream的read()和write()方法而不是它的&gt;&gt;和&lt;&lt;运营商。 read()和write()对于二进制模式更好; &GT;&GT;和&lt;&lt;对文本模式更好。

您可以指定read的内容。使用gcount,您可以询问,成功读取了多少字符。同样适用于write

答案 2 :(得分:0)

我尝试使用此代码:

    std::ifstream ifs(ofn.lpstrFile, std::ios::binary);
    std::ofstream myOutpue;
    char buffer[1024]; // create a buffer
    myOutpue.open("output.jpg", std::ios::binary);
    //client->sendFilePacket(FileStates::START_SAVE, buffer, false, i);
    while (ifs.read(buffer, sizeof(buffer)))
    {
        //client->sendFilePacket(FileStates::CONTINUE_SAVE, buffer, false, ifs.gcount());
        myOutpue.write(buffer, ifs.gcount());
    }
    //client->sendFilePacket(FileStates::END_SAVE, buffer, true, i);
    myOutpue.close();

但是,当我这样做时,在我的图像副本中,我只获得原始图像的一半和黑色屏幕的一半(kb的数量与原始文件中的相同),所以我不知道什么是问题那个?

答案 3 :(得分:0)

我知道已经很久了,但是阅读主题后我找到了解决方法...

std::ifstream ifs(ofn.lpstrFile, std::ios::binary);
std::ofstream myOutpue;
char buffer[1024]; // create a buffer
myOutpue.open("output.jpg", std::ios::binary);
//client->sendFilePacket(FileStates::START_SAVE, buffer, false, i);
while (ifs.read(buffer, sizeof(buffer)))
{
    myOutpue.write(buffer, ifs.gcount());
}
//
myOutpue.write(buffer, ifs.gcount());
myOutpue.close();

注意:循环后,您必须保存其余的读数,因为在循环中,您仅保存了适合缓冲区的内容,其余的则不执行任何操作。有时会发生剩余字符很少的情况,看起来图像的大小相同,但实际上不是。

注2:我在这里发布的内容是为了帮助那些仍然像我一样遇到麻烦的人!

答案 4 :(得分:-1)

请尝试使用ifstream::read方法

,而不是使用“手动”副本