ifstream + открытие случайного текстового файла (c_str)

Я хочу открыть случайный .txt файл и поместить данные в несколько строк.
Это работает, если я напишу путь в код.

Я не понимаю, почему это не работает.

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
string file;

ifstream filein(file.c_str());

cout << "Insert Path" << endl;
cin >> file;

cout << file << endl;

filein.open(file.c_str(), ios::in);

for (string line; getline(filein, line);) {
cout << line << endl;
}

return 0;
}

0

Решение

Ваша строка имени файла пуста, потому что std::string по умолчанию пусто.

Вы передаете пустую строку (или нулевую строку) ifstream конструктор, который в лучшем случае неопределенного поведения.

2

Другие решения

Попробуйте написать свой код так:

#include <iostream>
#include <fstream>

int main()
{
std::string file;

std::cout << "Insert Path" << std::endl;
std::getline(std::cin, file);

std::cout << file << std::endl;

std::ifstream filein(file);

for (std::string line; std::getline(filein, line); )
{
std::cout << line << std::endl;
}

return 0;
}

Известные правки включают в себя:

  • Мы сейчас строим ifstream возражать только тогда, когда нам это нужно, после file были сохранены данные, что означает, что поведение больше не определено, и что мы пытаемся открыть файл только после того, как знаем, каков путь.
  • Мы извлекаем целую строку при сохранении в file, а не только первое слово, которое имеет решающее значение, если ваш путь содержит пробелы.
  • Мы просто используем file строка напрямую. Там нет необходимости звонить c_str(),
  • Мы больше не используем using namespace std;, Есть много, много причин почему это плохая практика

Если у вас есть компилятор, совместимый с C ++ 17, я предлагаю вам написать код, который выглядит следующим образом:

#include <iostream>
#include <fstream>
//You may need to write #include <experimental/filesystem>
#include <filesystem>
#include <string>

int main()
{
std::string input_line;

std::cout << "Insert Path" << std::endl;
std::getline(std::cin, input_line);

//You may need to write std::experimental::filesystem
std::filesystem::path file_path{input_line};
//This will print the "absolute path", which is more valuable for debugging purposes
std::cout << std::filesystem::absolute(file_path) << std::endl;

std::ifstream filein(file_path);

for (std::string line; std::getline(filein, line); )
{
cout << line << endl;
}

return 0;
}

Явное использование path объекты сделают ваш код более читабельным и сделают ошибки более явными, а также предоставят вам доступ к поведению, к которому вы иначе не смогли бы получить доступ.

0

во-первых, что ты открываешь? пока ваша строка ничего не содержит ??

второй, даже если строка содержит действительный путь и открытие было успешным в первый раз, но во втором произойдет сбой, если вы используете один и тот же файловый поток для нескольких файлов без очистки его буфера и закрытия предыдущего файла:

string file "C:\\MyProject\\data.txt"; // let's say a valid path

ifstream filein(file.c_str());

if(filein.fail()) // the condition fails as long as the opening was successfull
cout << "failed to open file!" << endl;

cout << "Insert Path" << endl;
cin >> file; // let's say the user enters a valid path again: "C:\\MyProject\\test.txt"
cout << file << endl;

filein.open(file.c_str(), ios::in); // fail to correct it:

filein.close();
filein.clear(); // very important

filein.open(file.c_str(), ios::in); // now it's ok!

for (string line; getline(filein, line);) {
cout << line << endl;
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector