С++ - std::getline() ничего не возвращает

У меня есть функция 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;
}

Вы пытаетесь открыть файл дважды. Первая попытка успешна, а вторая нет, и поток переходит в состояние ошибки. Следовательно, getline потерпит неудачу (но ваш тест для открытого файла не будет).

Dúthomhas 10.04.2022 00:43

Удалите эту строку: file.open(filename);.

Retired Ninja 10.04.2022 01:11

С технической точки зрения std::getline возвращает ссылку на переданный ему входной поток. Проблема не в том, что он ничего не возвращает; дело в том, что попытка чтения не удалась.

Pete Becker 10.04.2022 01:46
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
3
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам не нужно вызывать file.open(filename);, потому что вы уже открыли файл с помощью конструктора std::ifstream file(filename);.

Вызов file.open(filename); после открытия файла с помощью конструктора приводит к тому, что поток переходит в состояние ошибки, поскольку файл еще не закрыт.

См. Разница между использованием конструктора fstream и открытой функции.

Другие вопросы по теме