尝试从文件中读取和存储数据,每个预期数据之间有多个空格

时间:2019-07-02 08:42:43

标签: c++ fstream

这是有关如何读取和存储数据的简单代码。我有一个文本文件,并且在文本文件内部是我想传递给numbertext的数据。如果文本文件包含诸如2 HelloWorld1 2 等文本存储在number中并且 HelloWorld1 存储在{{1}中,则代码运行良好}。

但是,如果txt文件中的文本是text,那么Hello,World和1之间有空格怎么办?我的问题是, 2 是否可以存储在2 Hello World 1中,而 Hello World 1 是否可以存储在number中。我了解到,由于存在空格,因此仅 2 Hello 分别存储在textnumber中。有办法克服吗?

text

2 个答案:

答案 0 :(得分:1)

您对默认的流运算符>>感到不走运(如果确实如此)。

1:知道格式

前进的方式是了解格式,从您不确定的帖子来看。

2:使用最佳工具完成工作

之后,您选择适合该工作的工具。这可能涉及:std :: getline和handpass,也许使用(在您的情况下,相当简单),boost :: spirit,令牌化技术,boost :: string_algo,lex / bison等。 我要补充一点,自定义流运算符功能(虽然可能)很少是直接的选择。

3:设计格式以匹配

作为了解格式的替代方法,如果可以设计格式,那就更好了。如果您具有记录样式格式,则处理带空格的字符串的一种简单方法是将字符串放在最后-然后将每条记录放在一行上。这样,您可以首先使用例如来查看每一行。 std::getline,然后仅使用流运算符进行其余操作-知道字符串将排在最后。当然也可以使用其他定界符(而不是换行符)。

答案 1 :(得分:0)

我想在@darune的很好答案中添加一个示例。

这完全取决于输入格式。

假设您的行以数字开头,然后以字符串结尾,则可以使用以下方法:

  1. 首先使用提取运算符>>读取数字>>
  2. 使用getline阅读其余内容

请参阅:

#include <iostream>
#include <string>
#include <sstream>
#include <cctype>
#include <algorithm>
#include <regex>

std::istringstream testData (
R"#(1   data1
2 data2 data3 
3 data    4
)#");


int main()
{
    // Definition of variables
    int number{};
    std::string str{};

    // Read file
    // Read the number
    while (testData >> number)
    {
        // Read the rest of the line in a string
        getline(testData, str);
        // Remove leading and trailing spaces
        str = std::regex_replace(str, std::regex("^ +| +$|( ) +"), "$1");
        // Show result
        std::cout << number << ' ' <<str << '\n';
    };
    return 0;
}

结果:

1 data1
2 data2 data3
3 data    4

但是如上所述,它很大程度上取决于输入格式