Я пытаюсь сделать свой первый урок с конструктором, и это, кажется, ведет себя странно.
Мой класс является производным от filebuf
и по какой-то причине я не могу открыть его в конструкторе.
Я пытался добавить cout
заявление для отладки, но <<
Оператор не распознан.
#include <iostream>
#include "bin.h"
int main()
{
bin myBin("e:\Temp\test.txt");system("PAUSE");
return 0;
}
bin.h
#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;
};
};
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 *
bin myBin("e:\Temp\test.txt");
Вы должны исправить вышеприведенную строку следующим образом:
bin myBin("e:\\Temp\\test.txt");
DEMO: http://cpp.sh/7b4k
Похоже, вам нужно:
#include <iostream>
Использовать std::string
тебе нужно:
#include <string>
iostream
может включать в себя заранее объявил std::string
но без полного определения вы не получите operator<<
(или же c_str()
).
Некоторые другие ответчики могут быть не в состоянии воспроизвести вашу проблему, потому что разные стандартные библиотеки могут иметь свои iostream
полностью сделать #include <string>
(это разрешено, но не обязательно).