在 C++ 中解析 .dat 文件

Posted

技术标签:

【中文标题】在 C++ 中解析 .dat 文件【英文标题】:Parse a .dat file in c++ 【发布时间】:2014-04-11 20:44:47 【问题描述】:

我有一个 .dat 文件,但每一行都不同。 我的意思是有一行带有double 和一行带有字符串。

我可以读取文件,甚至可以解析它,但字符串出现问题。 如果我有一行只有“A”作为字符串,它会给我带空格的字符串。我不 知道出了什么问题,但这里是

我的代码:

ifstream file;
file.open(name,ios::in|ios::binary);
vector<string> strings;
string line;

if (file.is_open())

    while(file.good())
    
        vector<double> vdoubles;

        getline(file,line,'\n');
        stringstream ss(line);

        double num= 0.0;
        string str = ss.str();

        if (! (ss >> num)) // if this is a string and not double
        
            strings.push_back(str);
        
        else
        
            do
            
                vdoubles.push_back(num);
            while ( ss >> num);


        
    

.dat 文件示例:

A
0.02 0.4 0.6
BC
0.45 0.5 0.8

当我调试时,我看到了应该是的字符串向量,但是当我打印向量时,它会在向量元素之间打印出空格,即使我将其打印为

for (int i = 0; i < strings.size(); i++)
    cout << strings[i];
cout << endl;

那为什么它也给我空间呢?

【问题讨论】:

@CantChooseUsernames 你确定吗?现在,当我尝试打印向量时,它会打印有关先前元素的信息.. 我不知道出了什么问题!这让我疯狂! :) .dat 文件中可能有空格吗? 我发布了 .dat 文件的样本。每行由回车键分隔。并且在 double 值之间有空格。 不完全确定...一种想法是它可能会将双精度之间的空格读取为字符串,因为您正在寻找新行作为分隔符。 好的,但是如果按照你说的那样做,那么当我读取包含“A”的第一行并将其存储在向量中时,它不需要在字母后包含空格。没有? 【参考方案1】:

好的,所以答案是您不能使用相同的字符串流来解析不同的类型。 所以这就是解决方案

    if (! (ss >> num)) // if this is a string and not double
    
        stringstream l;
        l << line;
        l >> str;   
        strings.push_back(str);
    
    else
    
        do
        
            vdoubles.push_back(num);
        while ( ss >> num);


    

【讨论】:

以上是关于在 C++ 中解析 .dat 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在C++中解析命令行参数

在 Java 和 C++ 应用程序中使用 protobuf 解析时出错

在 C++ 中解析 .dat 文件

解析/处理 C++ 文件的选项

如何在 C++ 中快速解析空格分隔的浮点数?

在 C++ 中从文件末尾读取的最有效方法是啥? (解析文件中的最后 128 位)