c++ - 从文件中获取整行
问题描述
我的程序可以读取字符串和整数,但问题是当我为名称等字符串添加空格时,它不会执行 viewOrder() 函数。我是编程新手,19 岁开始学习 c++ 作为我的第一语言,希望有人能帮助我。我正在做一个统一的订购系统。
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
struct orderDetails{
string name;
int studentNumber;
string address;
string dressCode;
int quantity;
};
void takeOrder(){
orderDetails order;
ofstream file ("database.dat" , ios::app);
cin.ignore();
cout << "Enter name: ";
getline(cin,order.name);
cout << "Enter Student Number: ";
cin >> order.studentNumber;
cin.ignore();
cout << "Enter Address: ";
getline(cin,order.address);
cout << "Enter Dress Code: ";
cin >> order.dressCode;
cout << "Enter Quantity: ";
cin >> order.quantity;
file << order.name << endl
<< order.studentNumber << endl
<< order.address << endl
<< order.dressCode << endl
<< order.quantity << endl;
file.close();
}
void viewOrder(){
ifstream database("database.dat");
orderDetails order;
while(database >> order.name >> order.studentNumber >> order.address >> order.dressCode >> order.quantity){
cout << endl << order.name << endl << order.studentNumber << endl << order.address << endl << order.dressCode << endl << order.quantity << endl;
}
}
int main(){
cout << "1.Take Order \n2.View Order \n3.Exit \nPlease Choose A Number: ";
int choice;
cin >> choice;
switch(choice){
case 1:
system("CLS");
takeOrder();
break;
case 2:
system("CLS");
viewOrder();
break;
default:
break;
}
return 0;
}
解决方案
这是一个老问题。您需要了解格式化和未格式化输入之间的区别。
如果您有一行文字,例如
abc def
然后你把它读成std::string
s
inputFileStream >> s1 >> s2
然后输入“abc”和“def”将被读入到字符串变量中。好的。但是,不会消耗行尾的换行符('\n')。如果你写一个额外的
inputFileStream >> s1 >> s2
要读取下一行,则插入运算符 >> 将跳过空格 '\n' 并按照您的预期读取字符串。
但是,如果您std::getline
在初始格式化输入之后使用,那么,请记住在行尾仍然有一个未使用的 '\n',只会读取一个空字符串和换行符。
为了克服这种情况,您可以使用std::ws
. 请在此处查看说明。因此,您只需将其添加到您的std::getline
语句中。
像这样:
std::getline(ifs >> std::ws, line);
这将占用您要阅读的下一个文本前面的所有空格(包括“\n”)。
为了更好地解释它。这是一个嵌套语句。所以,首先ifs >> std::ws
被执行。此操作再次返回ifs
,然后std::getline
将完成。你当然也可以ifs >> std::ws
在std::getline
. 在大多数情况下,这比调用ignore
.
但要记住。仅当您从格式化输入切换到未格式化输入时,这才是必需的。
推荐阅读
- spring - MongoDB Springboot Query 注释只给出第一条记录
- tensorflow - Keras-二元多标签分类的加权二元交叉熵
- node.js - 如何在github上将客户端和服务器端项目文件夹作为一个项目(api +前端)一起推送?
- php - 选择下拉菜单始终显示最后一个选择
- azure - 如何为相同资源类型的多个资源创建不同的指标类型警报
- python - 如何解析 Airflow 中的嵌套宏
- c# - 如何使用 c# 运行 exe 文件(我不能使用 Process.Start() 因为我不知道 exe 文件的位置)
- java - JSF @Inject 机制返回 NullPointerException
- python-3.x - 如何让 Python 什么都不做
- python - 无需训练模型的人指甲分割