amirak20 Ответов: 2

Получение входных данных из файла


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

Поэтому в этой задаче я должен получить свои входные данные из файла, и из того, что я узнал, я могу сделать это с помощью ifstream. Я написал условие, что если файл не откроется, пришлите мне сообщение об ошибке.
и моя проблема в том, что он не работает, и я все время получаю сообщение об ошибке, и кажется, что он не может открыть файл, и я не могу понять, почему он не открывает файл.
///////////////////////// my header file
#ifndef header_h
#define header_h


#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

struct cam{
    string  name;
    string post;
    int age;
    int salary;
};

void data_input(string fn1, vector<cam> & W);         /*input data from our input file*/
#endif
/////////////////////////


/////////////////////////the main
#include <iostream>
#include <fstream>
#include "header.h"
using namespace std;

string inputfile="input.txt";
string outfile="output.txt";
vector<cam> employee_details;

int main()
{
    data_input(inputfile, employee_details);
    return 0;
}
/////////////////////////


/////////////////////////this the cpp file 
#include <stdio.h>
#include <iostream>
#include <vector>
#include <fstream>
#include "header.h"

using namespace std;

void data_input(string fn1, vector<cam> &W){
    string tmp;
    ifstream f1( fn1.c_str() );
   
    if( f1.is_open() )
    {
        while( f1.good() ))
        {
            //reading names
            getline (f1,tmp,';');
            cam tmp_cam;
            tmp_cam.name=tmp;
            W.push_back(tmp_cam);
            
            //reading the ages
            getline(f1,tmp,';');
            W.back().age = atoi( tmp.c_str() );
            
            //reading the ranks
            getline (f1,tmp,';');
            W.back().post = tmp;
            
            //reading the salaries
            getline (f1,tmp,';');
            W.back().salary = atoi( tmp.c_str() );
            
        }
      
        f1.close();
    }
    else
    {
        cout << "Error to open the file" <<  endl;
    }
    
}
/////////////////////////


Что я уже пробовал:

все что я мог найти в сети но я чувствую что упускаю что то очень маленькое вот почему мне пришло в голову почему бы не поделиться этим здесь и не посмотреть на это с разных точек зрения

Richard MacCutchan

Скорее всего, этот файл не существует в рабочем каталоге вашего приложения.

amirak20

это было первое, что я сделал, этого не может быть.

Richard MacCutchan

Ну, это должно быть что-то похожее. Я только что построил и запустил ваш код, и он отлично работает: после удаления лишней закрывающей скобки на вашем while заявление.

2 Ответов

Рейтинг:
2

KarstenK

Похоже, ваше приложение не находит файл. Лучше сказать, что файл не является каталогом запущенного процесса. Это может отличаться, поэтому лучше взглянуть на настройки проекта.

Как всегда лучше всего использовать полный путь для файловых операций. Так же и для процесса вывода!!!

Научитесь использовать отладчик. Этот учебник по отладчику это дает некоторые базовые знания.


Рейтинг:
13

Jochen Arndt

Вы можете распечатать сообщение о системной ошибке при неудачном открытии:

ifstream f1( fn1.c_str() );
if ( f.fail() )
    cerr << "Failed to open file: " << strerror(errno);
Как уже отметил Ричард, файл может не существовать в текущем каталоге. Затем вы должны переместить или скопировать его или использовать абсолютные пути для ваших файлов.


amirak20

Я попробовал этот код, и да, проблема заключается в файле, но я скопировал файл в основной каталог с тем же именем, что и тот, который я ввел в программу.

Jochen Arndt

При использовании имени файла без пути используется текущий рабочий каталог. Возможно, это все еще не ваш "главный каталог".

При выполнении приложения из командной строки рабочим каталогом являются те (обычно), которые отображаются в командной строке.

При выполнении приложения из среды IDE рабочим каталогом обычно является каталог исполняемого файла. Например, в Visual Studio это не основной каталог вашего проекта, а Release resp. Отладочный подкаталог.

Чтобы показать текущий рабочий каталог, вы можете использовать функцию getcwd() в своем приложении.

amirak20

спасибо за вашу помощь функция getcwd() помогла, и теперь моя программа работает.