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