从.txt文件中读取整数和双精度,该文件也包含字符串

时间:2014-04-27 18:16:43

标签: c++ string parsing ifstream

我想编写一个从文件中读取文本行的程序。每行包含几个字符串,一个整数和一个double值。预先不知道行数(即,程序需要读取行直到文件结束),并且每行的长度也是未知的。 while循环检查行是否按以下方式排序:

 --  string -- integer -- double --- string  
Cat.     3:           18.00 Kr.       [ Tvål ]    
Cat.     1:           14.50 Kr.       [ Äppelmos Bob ]     
Cat.     1:           12.00 Kr.       [ Coca Cola 2 lit. ]     
Cat.     1:           18.00 Kr.       [ Kroppkakor 4 st. ] 

问题是最后一个字符串包含多个空格,因此程序不会将其作为整个字符串。最后一个字符串被接受,就像几个字符串一样,我只在屏幕上看到 Cat。 3:18.00 Kr。而不是整个行列表。

我试图处理这样的程序:

double doubleValue;

int intValue;

string str1, str2, str3;

ifstream infile("Register.txt", ifstream::in);

while (infile >> str1 >> intValue >> str2 >> doubleValue >> str3)
{   
   cout << intValue << " " << doubleValue << endl;
}

提前致谢。

3 个答案:

答案 0 :(得分:2)

这是因为operator>>将停止在空格处解析。

要计算,您可以先使用std::getline()阅读整行。然后,解析前四个部分(通过应用std::stringstream),最后再次调用std::getline()来获取剩余部分。

#include <sstream>
using namespace std;

string line;
while (getline(infile, line)) // read the whole line from the file
{
    stringstream ss(line);
    ss >> str1 >> intValue >> str2 >> doubleValue; // pause the first four parts
    getline(ss, str3); // parse the remaining part to str3, e.g. "Kr. [ Tvål ]"
}

答案 1 :(得分:2)

你总是可以使用fscanf,它会让你,只要你知道格式:

fscanf(f, "%s %d [ %[^\x5D]\x5D %lf", str1, &int1, str2, &double1);

我个人更喜欢scanf,这是一个简单的表格:

fmt   meaning
%s    non-whitespace string
%d    integer
%u    unsigned integer
%ld   long
%lu   unsigned long
%f    float
%lf   double
%llf  long double

它也处理特殊格式,但这超出了这个范围。但是如果你说有这样一个文件它很有用:

30.1 multi word string

你可以通过

阅读
scanf("%lf %[^\n]\n", &mydouble, strbuf);

偏好是关键,但我建议您使用fscanf

fscanf(FILE *f, char *fmt, ...);

http://www.manpagez.com/man/3/fscanf/

答案 2 :(得分:0)

这是有效的,感谢 herohuyongtao 。 这是一个完整的代码片段,允许读取.txt文件,其中包含字符串,整数,双精度和仅打印整数和双精度值。
这是txt文件的一部分。

Cat.     3:           14.50 Kr.       [ Äppelmos Bob ]     
Cat.     2:           12.00 Kr.       [ Coca Cola 2 lit. ]     
Cat.     5:           18.00 Kr.       [ Kroppkakor 4 st. ]

..........

..........

解决方案如下。

    using namespace std;

        cout << "Category totals for last opening period: " << endl;

        double doubleValue;
        int intValue;
        string line, str, str2, str3;

        ifstream infile("Register.txt", ifstream::in);
        getline(infile, line);

        while (getline(infile, line))
        {   
            stringstream infile(line);
            infile >> str >> intValue >> str2 >> doubleValue;
            getline(infile, str3);
            cout << endl;

                cout << setw(3) << str << setw(1) << intValue << setw(7)                                                 << str2 << doubleValue << str3;
        cout << endl;

        }