Чтение файла с использованием переменной для хранения имени файла

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

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

string f_user;
string l_user;

int main(){
   cout<< "What is your first name?";
   cin >> f_user;
   cout<< "What is your last name?";
   cin >> l_user;

   string file_name= f_user + l_user + ".txt";


   ifstream inFile(file_name);

   if (inFile.is_open()){
       string c;
       while (getline(inFile, c)){
           cout<< c;
       }
   }

   if (inFile.fail()){
       cout << "User not Found"<< endl;
   }

   inFile.close();
}

Проблема представленного здесь кода заключается в том, что вы не объявили переменные f_user и l_user. Вам нужно что-то вроде string f_user, l_user; в начале main.

john 23.05.2024 20:24

Где заявлен f_user? Показанный код не скомпилируется. Аналогично для l_user.

G.M. 23.05.2024 20:24

@seraphim Отредактируйте вопрос, не добавляйте код в комментарий.

john 23.05.2024 20:28

Пожалуйста, используйте функцию редактировать, чтобы обновить свой пост, а не добавлять новую информацию в комментариях.

G.M. 23.05.2024 20:29

@seraphim Итак, настоящая проблема в том, что код не находит файлы, которые, по вашему мнению, должны быть?

john 23.05.2024 20:29

вам необходимо указать полный путь к файлу при вызове конструктора ifstream. К вашему сведению, вы пытаетесь прочитать файл, а не переменную.

subram 23.05.2024 20:39

@subram - это не обязательно так. Если файл находится в текущем каталоге, вы можете открыть его, указав только его имя.

Pete Becker 23.05.2024 20:43

Да, я думаю, проблема в том, что он не находит файл. Поскольку я поставил оператор if (inFile(fail)) и он возвращает «Пользователь не найден».

seraphim 23.05.2024 21:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
89
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

файл может существовать, но getline может выйти из строя. в этом случае fail() вернет true. Чтобы отличить это, сделайте что-нибудь, что:

   if (inFile.is_open()){
       string c;
       while (getline(inFile, c)){
           cout<< c;
       }
   } else {
       cout << "User not Found"<< endl;
   }

Обратите внимание, что файл может не открыться по многим причинам, а не только потому, что он не существует. Стандартная библиотека не скажет вам, почему, поэтому рассмотрите возможность использования std::filesystem::exists() или его эквивалента, если вам нужно различать. Конечно, это приводит к гонке TOCTOU, так что будьте осторожны.

Remy Lebeau 23.05.2024 21:49

спасибо, оказывается, файл находился за пределами папки, в которой хранится код.

seraphim 23.05.2024 22:03
Ответ принят как подходящий

Если это не удается из-за того, что он ищет не в том каталоге, и вы не знаете, в каком, воспользуйтесь следующей идеей: создайте файл вместо его чтения. Затем просмотрите весь жесткий диск и найдите этот файл.

string file_name= f_user + l_user + ".txt";
file_name = "haha"; // use a made-up unique file name
ofstream hack;
hack.open(file_name);

Запустите этот код, найдите файл и удалите код.

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