C++ 需要在文件中使用getline的帮助吗

C++ 需要在文件中使用getline的帮助吗,c++,fstream,getline,C++,Fstream,Getline,我在显示输出时遇到问题。总有一行和另一行正在打印。我做了一些研究,结果发现这是因为我的getline。我也为格式道歉 #include <iostream> #include <fstream> #include <string> using namespace std; struct menuItemType { string menuItem; double menuPrice; }; int main() { menuItemType plai

我在显示输出时遇到问题。总有一行和另一行正在打印。我做了一些研究,结果发现这是因为我的getline。我也为格式道歉

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

using namespace std;

struct menuItemType
{
string menuItem;
double menuPrice;
};

int main()
 {
 menuItemType plainEgg;
 menuItemType baconEgg;
 menuItemType muffin;
 menuItemType frenchToast;
 menuItemType fruitBasket;
 menuItemType cereal;
 menuItemType coffee;
 menuItemType tea;

ifstream infile;
infile.open("Ch9_Ex5Data.txt"); 

while(infile)
{
getline(infile,plainEgg.menuItem);
infile >> plainEgg.menuPrice;

getline(infile,baconEgg.menuItem);
infile >> baconEgg.menuPrice;

getline(infile,muffin.menuItem);
infile >> muffin.menuPrice;

getline(infile,frenchToast.menuItem);
infile >> frenchToast.menuPrice;

getline(infile,fruitBasket.menuItem);
infile >> fruitBasket.menuPrice;

getline(infile,cereal.menuItem);
infile >> cereal.menuPrice;

getline(infile,coffee.menuItem);
infile >> coffee.menuPrice;

getline(infile,tea.menuItem);
infile >> tea.menuPrice;

cout << plainEgg.menuItem << plainEgg.menuPrice << endl;
cout << baconEgg.menuItem << baconEgg.menuPrice << endl;
cout << muffin.menuItem << muffin.menuPrice << endl;
cout << frenchToast.menuItem << frenchToast.menuPrice << endl;
cout << fruitBasket.menuItem << fruitBasket.menuPrice << endl;
cout << cereal.menuItem << cereal.menuPrice << endl;
cout << coffee.menuItem << coffee.menuPrice << endl;
cout << tea.menuItem << tea.menuPrice << endl;
}
infile.close();

return 0;
}
我试着用

if (infile.eof())
    cout << endl;
if(infle.eof())

cout所示代码中至少有三个主要问题。第一个未正确检查文件结束条件:

while(infile)
这将检查输入流是否已进入失败状态

读取文件中的最后一行后,输入流尚未失败。到目前为止,一切都完全按照计划进行

因此,在文件的最后一行之后,该条件仍将计算为true,再次运行循环。当然,它将惨败

如果文件已经遇到文件结束条件,则显式检查
if(infle.eof())
同样会遇到文件结束条件

您可能想做的是尝试开始读取文件中的下一行,如果失败,那么您已经到达了它的末尾:

while (getline(infile,plainEgg.menuItem))
{
      // The code that reads the next set of items.
但单凭这一点并不能解决你所有的问题

getline(infile,plainEgg.menuItem);
infile >> plainEgg.menuPrice;
这是混合了一个未格式化的输入操作,
std::getline()
,和一个格式化的输入操作,
操作符

这种组合是脆弱的,有几种不明显的故障模式,所以我不再重复了;有关更多信息,请参见前面的问题

尽管有正确执行此操作的方法,但在完全理解如何正确组合未格式化和格式化的输入操作之前,重写代码以仅使用
std::getline()
,或使用
>
运算符读取所有内容会更容易


最后一个问题是一个小问题。显示的代码无法正确处理不完整的输入和错误检查。如图所示,只要它成功读取了一组数据中的第一个片段,它就假定剩余的数据将在那里。您应该验证是否正确检查了每个输入操作(无论您选择使用格式化还是非格式化输入操作)是否成功。

在读取时测试错误,而不是在读取16次之前测试一次,因为所有操作都可能失败。在混合getline和
>
时,如果没有一些忽略来吃剩下的换行符,您也会遇到一些问题。既然你的价格是一个字符串,你不妨通读全文,简化你的生活。您也可以考虑数组,不能在getline之后使用eof(),因为这是文件的结尾。您可能应该检查EOL或在getline()中使用\n作为分隔符,并使用get line()而不是>>这是关于混合使用
getline
>
的一些不错的读物@退休的Inja谢谢你的帮助,我会读更多的。@SurajS我会更新我的代码并再次发布。谢谢
while (getline(infile,plainEgg.menuItem))
{
      // The code that reads the next set of items.
getline(infile,plainEgg.menuItem);
infile >> plainEgg.menuPrice;