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

trying to read and store data from a file where there are multiple spaces between each intended data

本文关键字:数据 存储 空间 文件 读取 之间      更新时间:2023-10-16

这是我读取和存储数据的简单代码。我有一个文本文件,在文本文件中是我要传递给numbertext的数据。如果文本文件包含诸如2 HelloWorld1 2 之类的文本,则该代码运行正常,并且存储在number中, Helloworld1 存储在text中。

但是,如果TXT文件中的文本就是这样,2 Hello World 1在Hello,world和1之间有空间?我的问题是, 2 是否可以存储在number Hello World 1 中,可以存储在text中。我知道,由于空间空格,因此仅 2 hello 分别存储在numbertext中。有没有办法克服这一点?

using namespace std;
int main(){
    ifstream theFile("key.txt");
    int number;
    string text;
    while(theFile>>number>>text){
        cout<<number<<" and "<<text<<endl;
    }
}

您对默认流操作员>>不幸(如果确实是您的情况(。

1:知道格式

前进的道路是知道从您的帖子中判断的格式您对您的帖子有些不确定。

2:使用最佳工具

之后,您为作业选择合适的工具。这可能涉及:std :: getline和手动,也许是使用正则表达式(在您的情况下,相当简单(,boost :: Spirit,tokenization Techniques,boost :: String_algo,lex/bison等。我会补充说,自定义流操作员功能(虽然可能(很少是直接的选择。

3:设计格式以匹配

作为了解格式的替代方法,如果您可以设计它,那就更好了。如果您具有记录样式格式,则使用空格处理字符串的简便方法是将字符串延续到最后 - 然后将每个记录放在一条线上。这样,您可以首先使用EG查看每条线。std::getline,然后仅将流操作员用于其余部分 - 知道字符串将是最后的。其他定界符(除线额(当然也可行。

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

这一切都取决于输入格式。

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

  1. 首先阅读带提取器操作员>>
  2. 的数字
  3. 使用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

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