C++ 读取文件的问题

C++ 读取文件的问题,c++,C++,我交了一份家庭作业,我认为是读文件错误。由于明显的原因,我不想发布我所有的作业代码。我们正在放春假,几周后我可能会从我的教授那里得到反馈。我似乎总是在努力阅读文件,所以我想在本周有时间的时候把事情弄清楚 赋值的要点是创建一个简单的person对象,该对象有一个包含字符串“gift”的STL集合容器和一个包含名称作为数据成员的字符串。然后,创建一组这些对象。该程序的第一个方面是读取具有以下格式的文件,其中行上的第一个单词始终是名称,引号之间是礼物创意: Tom "iphone" Bill

我交了一份家庭作业,我认为是读文件错误。由于明显的原因,我不想发布我所有的作业代码。我们正在放春假,几周后我可能会从我的教授那里得到反馈。我似乎总是在努力阅读文件,所以我想在本周有时间的时候把事情弄清楚

赋值的要点是创建一个简单的person对象,该对象有一个包含字符串“gift”的STL集合容器和一个包含名称作为数据成员的字符串。然后,创建一组这些对象。该程序的第一个方面是读取具有以下格式的文件,其中行上的第一个单词始终是名称,引号之间是礼物创意:

Tom     "iphone"
Bill    "guitar"
Bill    "pencils"
Steve   "speaker"
Mary    "tennis racket"
Jenny   "golf balls"
John    "printer"
Bill    "books"
Mary    "books"
在屏幕上打印时,格式应为:

Bill    books, guitar, pencils
Jenny   golf balls
John    printer
Mary    books, tennis racket
Steve   speaker
Tom     iphone
在VisualStudio中,一切都很好。但是,当我编译并使用gcc运行时,输出如下所示:

, pencilsooks
Jenny   golf balls
John    printer
Mary    books, tennis racket
Steve   speaker
Tom     iphone
在休息几天并查看我的readfile函数后,我注意到一些不可靠的东西,它不是一个编写良好的函数。也就是说,在VS中,当我调试时,一切似乎都正常。当我在学校连接到linux服务器进行gcc测试时,出现了一些问题,但我不知道如何像在VS中那样在linux中进行调试(这是我需要学习的)

无论如何,下面是我的readfile函数:

//library facilities used: fstream, assert
//Postcondition: set of person objects have been created from file
void read_file(const char* file_name, set<person> &list)
{
    ifstream infile;
    infile.open(file_name);
    assert(infile);
    while( infile.good() )
    {
        string tmp_name; //stores name from file
        string tmp_gift; //stores gift from file
        person p_tmp;     //to be added to person_list
        set<person>::iterator people_iter; 

        infile >> tmp_name;//get 1st name in file

        //check to see if it's in the set of people
        if( in_list(tmp_name, list) )
        {
            getline(infile, tmp_gift, '\n'); //get the gift
            strip_punct(tmp_gift);
            add_to_existing(tmp_name, tmp_gift, list);
        }
        else //name is not in list
        {
            p_tmp.set_name(tmp_name);//set the name
            getline(infile, tmp_gift, '\n'); //get the gift
            strip_punct(tmp_gift);// get rid of quotes and other puncts
            p_tmp.insert_gift(tmp_gift);  //insert gift string into set of gifts for that person
            people_iter = list.begin();//add person to list of people
            list.insert(people_iter, p_tmp);    
        }//end else

    }// end while( infile.good() )

    infile.close();

}//end read_file
//使用的库设施:fstream,assert
//Postcondition:已从文件创建一组person对象
无效读取文件(常量字符*文件名、集合和列表)
{
河流充填;
infle.open(文件名);
断言(填充);
while(infle.good())
{
字符串tmp_name;//存储文件中的名称
字符串tmp_gift;//存储文件中的礼物
person p_tmp;//要添加到person_列表中
集合::迭代器;
infle>>tmp_name;//获取文件中的第一个名称
//检查是否在人群中
if(在列表中(tmp\U名称,列表))
{
getline(infle,tmp_gift,'\n');//获取礼物
脱衣舞(tmp_礼品);
将_添加到现有_(tmp_名称、tmp_礼品、列表);
}
else//name不在列表中
{
p_tmp.set_name(tmp_name);//设置名称
getline(infle,tmp_gift,'\n');//获取礼物
剥去斑点(tmp礼物);//去掉引号和其他斑点
p_tmp.insert_gift(tmp_gift);//将礼品串插入给该人的一套礼品中
people_iter=list.begin();//将人员添加到人员列表中
列表。插入(人员、项目管理计划);
}//结束其他
}//结束时(infle.good())
infle.close();
}//结束读取文件

问题在于试图读取您在Windows上创建的文本文件。它们有像
\r\n
这样的换行符,并且回车字符在
吉他的字符串中结束。我也考虑过这个问题。我用vi打开了文件,看起来还不错。我将再次测试并在vi中创建该文件,然后返回给您。FWIW,我以前在VS或notepad++中创建的数据文件中没有遇到过类似的问题。你说得对!有趣的是,如果我在vi中打开原始文件,删除(通过退格)内容,然后键入数据,回车符仍然存在。我不得不在vi中创建一个新文件来解决这个问题。我很确定教授使用他自己的数据文件来评分,所以我想我没问题。