У меня есть функция C++, которая читает файл .txt, однако, когда я ее запускаю, std::getline ничего не возвращает. Поэтому цикл while в строке 22 не выполняется.
Как исправить эту функцию, чтобы она возвращала вектор, где каждая строка является отдельным элементом вектора?
Файл, который я читаю из файла .txt, состоит из двух строк:
testing
123
Вот мой код:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
std::vector<std::string> readf(std::string filename)
{
std::ifstream file(filename);
file.open(filename);
// Check if file is open
if (!file.is_open())
{
std::cout << "Error opening file: " << filename << std::endl;
exit(EXIT_FAILURE);
}
std::vector<std::string> lines;
std::string line;
// Read the file
while (std::getline(file, line))
{
if (line.size() > 0)
lines.push_back(line);
}
return lines;
}
Удалите эту строку: file.open(filename);
.
С технической точки зрения std::getline
возвращает ссылку на переданный ему входной поток. Проблема не в том, что он ничего не возвращает; дело в том, что попытка чтения не удалась.
Вам не нужно вызывать file.open(filename);
, потому что вы уже открыли файл с помощью конструктора std::ifstream file(filename);
.
Вызов file.open(filename);
после открытия файла с помощью конструктора приводит к тому, что поток переходит в состояние ошибки, поскольку файл еще не закрыт.
См. Разница между использованием конструктора fstream и открытой функции.
Вы пытаетесь открыть файл дважды. Первая попытка успешна, а вторая нет, и поток переходит в состояние ошибки. Следовательно, getline потерпит неудачу (но ваш тест для открытого файла не будет).