Попробуйте написать код так:
#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;
. Есть many, many reasons, почему это плохая практика.
EDIT:
Если у вас есть 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
объекты сделают ваш код более читабельным и сделают ошибки более явными, а также предоставят вам доступ к поведению, к которому вы в противном случае не смогли бы получить доступ.
Когда вы натолкнулись на это в отладчике, что такое 'файл'? Что это должно быть? –