首页 > 解决方案 > 从文件中获取整行

问题描述

我的程序可以读取字符串和整数,但问题是当我为名称等字符串添加空格时,它不会执行 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;
}

标签: c++stringstructureifstreamgetline

解决方案


这是一个老问题。您需要了解格式化和未格式化输入之间的区别。

如果您有一行文字,例如

abc def

然后你把它读成std::strings

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::wsstd::getline. 在大多数情况下,这比调用ignore.

但要记住。仅当您从格式化输入切换到未格式化输入时,这才是必需的。


推荐阅读