Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从这样的文件中读取特定数据?_C++_File_Info - Fatal编程技术网

C++ 如何从这样的文件中读取特定数据?

C++ 如何从这样的文件中读取特定数据?,c++,file,info,C++,File,Info,我想制作一个程序,通过类的输入函数将参与者的数据输入到txt文件中。然后使用输出函数通过键入单个参与者的ID一次提取其信息 在我的这段代码中,只要输入一个ID,我的while循环就会无限运行。我怀疑它无法找到eof。任何帮助都将不胜感激。我是C++新手。 #include <fstream> #include <sstream> #include <iostream> #include <string> using namespace std;

我想制作一个程序,通过类的输入函数将参与者的数据输入到txt文件中。然后使用输出函数通过键入单个参与者的ID一次提取其信息

在我的这段代码中,只要输入一个ID,我的while循环就会无限运行。我怀疑它无法找到eof。任何帮助都将不胜感激。我是C++新手。

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

class Participant{
private:
    int id, score;
    string name;
public:
    Participant(){
        id = 0; score = 0; name = "";
    }
    void input(){
        char choice;
        ofstream in;
        in.open("Participant.txt", ios::app);

        do{

            cout<<"Enter your ID:   \t";
            cin>>id;
            cout<<"Enter your name: \t";
            cin>>name;
            cout<<"Enter your Score:\t";
            cin>>score;

            in<<name<<" ";
            in<<id<<" ";
            in<<score<<endl;

            cout<<"Add another entry? (Y/N)\n";
            cin>>choice;

        }while(choice == 'y' || choice == 'Y');

        in.close();
    }

    void output(){
        int idout, holderID, holderS;
        string holder, output;
        cout<<"Enter the ID for more information related to the person:"; 
        cin>>idout;

        fstream out;
        out.open("Participant.txt");

        while(!out.eof()){
            out>>holderID;
            cout<<"looping...\n";
            if(idout == holderID){
                out>>holder;
                cout<<"Name: \t"<<holder<<endl;
                out>>holderS;
                cout<<"Score:\t"<<holderS<<endl;
                holder ="";
                holderS=0;
                break;
            }
            else continue;
        }

        out.close();
    }

    void max(){

    }
};

int main(){
char choice;
Participant player;

cout<<"Asking for Input: \n";
player.input();



system("pause");
system("cls");

cout<<"Data Viewing: \n";
do{
    player.output();
    cout<<"\nDo you wish to extract information on other players?\n";
    cout<<"Y - Yes."<<endl;
    cout<<"N - No."<<endl;
    cout<<"Choice: ";
    cin>>choice;
}while (choice == 'y' || choice == 'Y');
cout<<"\n\nEnd of Data Viewing.\n";
}

首先,我希望它只读取ID,第一行是1037。如果ID匹配,则应显示文件中接下来的2个成员;名称和分数。

问题是您试图直接从输出流使用holderID int。尝试使用字符串读取相同的输出值,并使用将其转换为int。 还要注意的是,在你写的时候,第一个是名字,后面是id和分数

#include <string>
#include <fstream>
#include <map>
#include <iostream>
#include <algorithm>
#include <sstream>

class Participants
{
    int id;
    int score;
    std::string name;
public:
    Participants(): id(0), score(0)
    {}

    Participants(int id, int score, std::string name): id(id), score(score), name(name)
    {}

    ~Participants()
    {}

    int GetId()
    {
        return id;
    }

    std::string encode()
    {
        auto strRet = std::string( name + " " + std::to_string(id) + " " + std::to_string(score) + "\n");
        return  strRet;
    }

    void decode(std::string text)
    {
        std::stringstream ss(text);
        std::string buf;

        //Read Name
        std::getline( ss, buf , ' ');
        name = buf;

        //Read id
        std::getline( ss, buf , ' ');
        id = std::stoi( buf );

        //Read Score
        std::getline( ss, buf , '\n');
        score = std::stoi( buf );

    }
};

class DataReader
{
    std::string fileName;
    std::fstream myfile;

public:
    DataReader(std::string fileName): fileName(fileName)
    {

    }
    ~DataReader()
    {

    }

    void ReadParticipants(std::map<int, Participants> &MapParticipants)
    {
        myfile.open(fileName, std::ios::in);
        MapParticipants.clear();
        if ( myfile.is_open() )
        {
            std::string line;
            while ( std::getline(myfile, line) )
            {
                Participants oParticipants;
                //Decode and Add to map
                oParticipants.decode(line);
                //Add to map
                MapParticipants[ oParticipants.GetId() ] = oParticipants;
            }
        }
        myfile.close();
    }

    void WriteParticipants(std::map<int, Participants> &MapParticipants)
    {
        //Load Map to find Duplicates
        std::map<int, Participants> MapParticipants_exist;
        ReadParticipants(MapParticipants_exist);

        myfile.open(fileName, std::ios::app);
        if ( myfile.is_open() )
        {
            for ( auto oParticipants : MapParticipants)
            {
                //Check for Duplicates (to Write or not)
                if ( MapParticipants_exist.find(oParticipants.first) ==  MapParticipants_exist.end() )
                {
                    auto text = oParticipants.second.encode();
                    myfile << text.c_str();
                }
            }
        }
        myfile.close();
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    DataReader oReader("File.txt");

    std::map<int, Participants> MapParticipants;

    //Make Some Participants
    Participants p1(1, 50, "TOM");
    Participants p2(2, 40, "TIM");
    Participants p3(3, 80, "JERRY");

    //Add them to map
    MapParticipants[p1.GetId()] = p1;
    MapParticipants[p2.GetId()] = p2;
    MapParticipants[p3.GetId()] = p3;


    oReader.WriteParticipants(MapParticipants);

    oReader.ReadParticipants(MapParticipants);

    //Find and Display
    int id = 2;
    auto it = MapParticipants.find(id);
    if ( it != MapParticipants.end() )
    {
        //Show/Print
        ...
    }

    return 0;
}
也可以使用以下内容作为参考。我曾经存储id、name和score的值

#include <string>
#include <fstream>
#include <map>
#include <iostream>
#include <algorithm>
#include <sstream>

class Participants
{
    int id;
    int score;
    std::string name;
public:
    Participants(): id(0), score(0)
    {}

    Participants(int id, int score, std::string name): id(id), score(score), name(name)
    {}

    ~Participants()
    {}

    int GetId()
    {
        return id;
    }

    std::string encode()
    {
        auto strRet = std::string( name + " " + std::to_string(id) + " " + std::to_string(score) + "\n");
        return  strRet;
    }

    void decode(std::string text)
    {
        std::stringstream ss(text);
        std::string buf;

        //Read Name
        std::getline( ss, buf , ' ');
        name = buf;

        //Read id
        std::getline( ss, buf , ' ');
        id = std::stoi( buf );

        //Read Score
        std::getline( ss, buf , '\n');
        score = std::stoi( buf );

    }
};

class DataReader
{
    std::string fileName;
    std::fstream myfile;

public:
    DataReader(std::string fileName): fileName(fileName)
    {

    }
    ~DataReader()
    {

    }

    void ReadParticipants(std::map<int, Participants> &MapParticipants)
    {
        myfile.open(fileName, std::ios::in);
        MapParticipants.clear();
        if ( myfile.is_open() )
        {
            std::string line;
            while ( std::getline(myfile, line) )
            {
                Participants oParticipants;
                //Decode and Add to map
                oParticipants.decode(line);
                //Add to map
                MapParticipants[ oParticipants.GetId() ] = oParticipants;
            }
        }
        myfile.close();
    }

    void WriteParticipants(std::map<int, Participants> &MapParticipants)
    {
        //Load Map to find Duplicates
        std::map<int, Participants> MapParticipants_exist;
        ReadParticipants(MapParticipants_exist);

        myfile.open(fileName, std::ios::app);
        if ( myfile.is_open() )
        {
            for ( auto oParticipants : MapParticipants)
            {
                //Check for Duplicates (to Write or not)
                if ( MapParticipants_exist.find(oParticipants.first) ==  MapParticipants_exist.end() )
                {
                    auto text = oParticipants.second.encode();
                    myfile << text.c_str();
                }
            }
        }
        myfile.close();
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    DataReader oReader("File.txt");

    std::map<int, Participants> MapParticipants;

    //Make Some Participants
    Participants p1(1, 50, "TOM");
    Participants p2(2, 40, "TIM");
    Participants p3(3, 80, "JERRY");

    //Add them to map
    MapParticipants[p1.GetId()] = p1;
    MapParticipants[p2.GetId()] = p2;
    MapParticipants[p3.GetId()] = p3;


    oReader.WriteParticipants(MapParticipants);

    oReader.ReadParticipants(MapParticipants);

    //Find and Display
    int id = 2;
    auto it = MapParticipants.find(id);
    if ( it != MapParticipants.end() )
    {
        //Show/Print
        ...
    }

    return 0;
}

这并不能解决这个问题,但要养成用有意义的值初始化对象的习惯,而不是默认地初始化对象并立即写入正确的值。也就是说,流动的变化;in.openParticipant.txt,ios::app;要访问inParticipant.txt',ios::app;。而且你不需要打电话进来。关闭;。析构函数会这样做。