Я действительно не нашел удовлетворенного ответа в Google, и ввод / вывод в C ++ немного сложен. Я хотел бы прочитать текстовый файл по блокам в вектор, если это возможно. Увы, я не мог понять, как. Я даже не уверен, что мой бесконечный цикл будет разорван во всех возможностях, потому что ввод / вывод сложен. Итак, лучший способ, которым я смог выяснить это:
char buffer[1025]; //let's say read by 1024 char block
buffer[1024] = '\0';
std::fstream fin("index.xml");
if (!fin) {
std::cerr << "Unable to open file";
} else {
while (true) {
fin.read(buffer, 1024);
std::cout << buffer;
if (fin.eof())
break;
}
}
Пожалуйста, отметьте вторую строку с ‘\ 0’. Разве это не странно? Могу ли я сделать что-то лучше? Могу ли я прочитать данные в вектор вместо массива символов? Уместно ли читать в векторе напрямую?
Спасибо за ваши ответы.
PS. Чтение кусками действительно имеет смысл. Этот код короткий, но я храню его в циклическом буфере.
Вы должны хорошо делать следующее
vector<char> buffer (1024,0); // create vector of 1024 chars with value 0
fin.read(&buffer[0], buffer.size());
Элементы в векторе гарантированно хранятся непрерывно, поэтому это должно работать, но вы должны убедиться, что вектор никогда не будет пустым. Я недавно задал подобный вопрос здесь — проверьте ответы на него для конкретных деталей из стандарта Могу ли я вызвать функции, которые принимают аргумент массив / указатель, используя вместо этого std :: vector?
std::ifstream fin("index.xml");
std::stringstream buffer;
buffer << fin.rdbuf();
std::string result = buffer.str();
Именно то, что вам нужно.
Недавно я столкнулся с той же проблемой. Я использую read и gcountоснование, чтобы решить это. Это работает хорошо. Вот код
vector<string> ReadFileByBlocks(const char* filename)
{
vector<string> vecstr;
ifstream fin(filename, ios_base::in);
if (fin.is_open())
{
char* buffer = new char[1024];
while (fin.read(buffer, 1024))
{
string s(buffer);
vecstr.push_back(s);
}
// if the bytes of the block are less than 1024,
// use fin.gcount() calculate the number, put the va
// into var s
string s(buffer, fin.gcount());
vecstr.push_back(s);
delete[] buffer;
fin.close();
}
else
{
cerr << "Cannot open file:" << filename << endl;
}
return vecstr;
}