0

我正在尝试使用构造函数制作我的第一堂课,但它似乎表现得很奇怪。我的类派生自filebuf并且由于某种原因,我无法在构造函数中打开它。我尝试添加一条cout调试语句,但<<无法识别操作符。

#include <iostream>
#include "bin.h"

int main()
{
    bin myBin("e:\Temp\test.txt");


    system("PAUSE");
    return 0;
}

二进制文件

#pragma once
#include <fstream>
#include <cstdlib>
#include <cstring>

class bin : private std::filebuf {

int buffSize = 1000;
char* buffer;
unsigned int length;
short int buffCounter;

public:
    bin(std::string fileName)
    {
        open(fileName.c_str(), std::ios::in | std::ios::out | std::ios::trunc);
        if (!is_open())
            std::cout << "ERROR: failed to open file " << fileName << std::endl;

        //set all IO operations to be unbufferred, buffering will be managed manually
        setbuf(0, 0);
        //create buffer
        buffer = new char[buffSize];

    };


     virtual ~bin()
    {
        delete buffer;
    };
};
4

4 回答 4

2
bin myBin("e:\Temp\test.txt");

您必须按如下方式更正上述行:

bin myBin("e:\\Temp\\test.txt");

演示:http ://cpp.sh/7b4k

于 2015-06-13T18:01:37.073 回答
1

看起来你需要:

#include <iostream>
于 2015-06-13T18:04:31.527 回答
1

要使用std::string您需要:

#include <string>

iostream包含可能已经提前声明,std::string但没有完整的定义,你没有得到operator<<(或c_str())。

其他一些回答者可能无法重现您的问题,因为不同的标准库可能已经iostream完全做到了#include <string>(这是允许的,但不是必需的)。

于 2015-06-14T15:22:49.040 回答
-1
std::cout << "ERROR: failed to open file " << fileName << std::endl;

应该

std::cout << "ERROR: failed to open file " << fileName.c_str() << std::endl;

std::cout不总是接受std::string但确实接受const char *

于 2015-06-13T18:05:01.480 回答