将混合数据文件读入 C++ 字符串

Posted

技术标签:

【中文标题】将混合数据文件读入 C++ 字符串【英文标题】:Reading a file of mixed data into a C++ string 【发布时间】:2008-11-19 17:40:57 【问题描述】:

我需要使用 C++ 读取带有空格的文本,后跟一个数值。

例如,看起来像这样的数据:

text1
1.0
text two 
2.1
text2 again
3.1

不能用 2 个"infile >>" 语句读入。我对getline 没有任何运气 任何一个。我最终想用这两个数据元素填充struct。有什么想法吗?

【问题讨论】:

【参考方案1】:

标准 IO 库不会单独为您执行此操作,您需要对数据进行某种简单的解析,以确定文本的结束位置和数值的开始位置。如果您可以做出一些简化的假设(例如说每行只有一个文本/数字对,并且错误恢复最少),那么将整个内容 getline() 变成一个字符串然后手动扫描它也不会太糟糕。否则,您最好使用正则表达式或解析库来处理这个问题,而不是重新发明***。

【讨论】:

【参考方案2】:

为什么?您可以使用 getline 提供空格作为行分隔符。如果 next 是数字,则缝合提取的部分。

【讨论】:

【参考方案3】:

如果您可以确定您的输入格式正确,您可以尝试以下示例:

#include <iostream>
#include <sstream>

int main()

    std::istringstream iss("text1 1.0 text two 2.1 text2 again 3.1");

    for ( ;; )
    
        double x;
        if ( iss >> x )
        
            std::cout << x << std::endl;
        
        else
        
            iss.clear();
            std::string junk;
            if ( !(iss >> junk) )
                break;
        
    

如果您确实必须验证输入(而不仅仅是尝试从中解析任何看起来像 double 的内容),您将不得不编写某种解析器,这并不难,但很无聊。

【讨论】:

也许我没有正确记住 std::string 的操作符的语义>>,但这不是无法在文本字段中收集任何空格吗? 是的,流的运算符>>都跳过了空格(physical-thought.blogspot.com/2008/06/…)。 是的,它会跳过空格,但作者只对数字感兴趣。我在这里写的只是从流中解析出所有以空格分隔的数字的“快速而肮脏”的方式。【参考方案4】:

伪代码。

这应该可行。但是,它假设您有成对的文本/数字。你也必须做一些调整才能让所有的打字都开心。

while( ! eof)
   getline(textbuffer)
   getline(numberbuffer)
   stringlist = tokenize(textbuffer)
   number = atof(numberbuffer)

【讨论】:

以上是关于将混合数据文件读入 C++ 字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中将整个文件读入 std::string?

将文本文件逐行读入并行数组C++

将字符串从文件中读入 1 个字符串,而不是整数 c++

在 C++ 中将文件读入字符数组

C++中怎么逐行读取数据

将文本文件读入二维向量。 C++