如何从文本文件 c++ 中读取具有一定长度空格的输入字符串

How to read input string with spaces of certain length from text file c++

本文关键字:空格 字符串 输入 具有一 读取 文本 文件 c++      更新时间:2023-10-16

我的问题是我正在尝试从文本文件中输入字符,字符串然后输入int。我知道如何使用 getline() 输入,但是在使用 get line() 函数后,不再有选项可以在字符串后面输入其余整数。我的问题是,如何输入一个字符,然后输入一个字符串(带空格)后跟 3 个整数?

数据.txt看起来像这样

a   New York    5    7   9
b   Virginia    10   2   5
c   Los Angeles 25   15  6

这是我的代码:

   int main()
   {
    string city;
    double price;
    int amt1, amt2, amt3;
    char orderStatus;
    ifstream warehouse;
    ofstream output;
    warehouse.open("data.txt");
    output.open("dataOut.txt");
    while (warehouse.good()) 
    {
        warehouse >> orderStatus;
        output << orderStatus << "t";
        getline(warehouse, city, 't');
        //warehouse >> city;
        output << city << endl;
        //warehouse >> amt1;
        //output << amt1 << "t";
        //warehouse >> amt2;
        //output << amt2 << "t";
        //warehouse >> amt3;
        //output << amt3;
    }

    warehouse.close();
    output.close();
    return 0;
   }

感谢您非常需要帮助。

一个快速的解决方案是使用atoi(链接到文档)。这听起来像家庭作业,所以我不想为你解决它(这有什么乐趣?),但你可以把值作为字符串拉进去。如果需要,您也可以一次手动将字符转换为整数并重建数字,但atoi会处理所有字符。我猜这些是 std::string,所以你必须对它们调用c_str(),因为 atoi 只接受 C 字符串。

这是我

对您的代码的编辑。我添加了一个warehouse >> noskipws >> orderStatus >> skipws;来跳过第一个制表符分隔符。此外,在每次读取后添加一个if(!warehouse.good()) break;,以防数据不完整。如果是C,我会做fscanf(file, " %c %[^t]s %d %d %d", ...).

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
    string city;
    double price;
    int amt1, amt2, amt3;
    char orderStatus;
    ifstream warehouse;
    ofstream output;
    warehouse.open("data.txt");
    output.open("dataOut.txt");
    while (warehouse.good()) 
    {
        warehouse >> orderStatus; 
        if(!warehouse.good()) break;
        output << orderStatus << "t";
        // to skip the tab delimiter
        warehouse >> noskipws >> orderStatus >> skipws;
        if(!warehouse.good()) break;
        getline(warehouse, city, 't');
        if(!warehouse.good()) break;
        output << city << "t";
        warehouse >> amt1;
        if(!warehouse.good()) break;
        output << amt1 << "t";
        warehouse >> amt2;
        if(!warehouse.good()) break;
        output << amt2 << "t";
        warehouse >> amt3;
        if(!warehouse.good()) break;
        output << amt3 << endl;
    }

    warehouse.close();
    output.close();
    return 0;
}