我想编写一个从文件中读取文本行的程序。每行包含几个字符串,一个整数和一个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;
}
提前致谢。
答案 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, ...);
答案 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;
}