您好我只是从文件中获取一些数据,但这很奇怪,因为我无法获取文本文件的第一列。这是我的文本文件:
1.2 2.6 3.5
1.02 3.05 4.65
7.15 0.54 9.26
这是我的代码:
#include <iostream>
#include <fstream>
int main() {
std::ifstream myFile("a.txt");
std::string line;
while(std::getline(myFile, line)) {
std::string col1, col2, col3;
myFile >> col1, col2 >> col3;
std::cout << col1 << " " << col2 << " " << col3 << std::endl;
}
return EXIT_SUCCESS;
}
所以我不明白为什么在执行程序时我无法在终端中看到:
1.2 2.6 3.5
1.02 3.05 4.65
7.15 0.54 9.26
相反,我看到了这一点:
1.02 3.05 4.65
7.15 0.54 9.26
非常感谢你!
答案 0 :(得分:0)
我建议使用operator>>
输入您的数据:
double col1, col2, col3;
char comma;
while (myFile >> col1)
{
myFile >> comma;
myFile >> col2 >> comma;
myFile >> col3;
//...
}
更好的方法是使用结构对输入行进行建模:
struct Record
{
double value1;
double value2;
double value3;
friend std::istream& operator>>(std::istream& input, Record& r);
};
std::istream& operator>>(std::istream& input, Record& r)
{
char comma;
input >> r.value1 >> comma;
input >> r.value2 >> comma;
input >> r.value3;
return input;
}
上面的代码允许您读取如下文件:
std::vector<Record> database;
Record r;
while (myFile >> r)
{
database.push_back(r);
}
要在文件中读取的代码片段不依赖于数据的格式,可用于读取其他格式。结构Record
确定数据的输入方式。
答案 1 :(得分:0)
Getline()和&gt;&gt;
问题是您使用getline()
检查输入,然后尝试使用>>
从您的信息流中读取。这不符合预期。
想象一下你的流中有某种光标。有std::fstream
的成员函数可以移动这个光标,有些则没有。
使用getline()
向前移动此光标。当您使用>>
时,光标已经通过了您想要获得的位置。
这有一些解决方法。最容易的是
int main(){
std::ifstream myFile("a.txt");
std::string line;
std::string col1, col2, col3;
while(myFile >> col1 >> col2 >> col3){
std::cout << col1 << " " << col2 << " " << col3 << std::endl;
}
return EXIT_SUCCESS;
}
使用stringstreams的另一个是
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
int main(){
std::ifstream myFile("a.txt");
std::string line;
while(std::getline(myFile, line)){
std::string col1, col2, col3;
std::istringstream stream(line);
copy(std::istream_iterator<std::string>(stream),
std::istream_iterator<std::string>(),
std::ostream_iterator<std::string>(std::cout, " "));
std::cout << std::endl;
}
return EXIT_SUCCESS;
}
错误使用逗号运算符
以下行也可能导致问题
myFile >> col1, col2 >> col3;
我的编译器Apple LLVM version 8.1.0 (clang-802.0.38)
甚至不允许这样做。 (转载here)所以我想你想要像这样使用逗号运算符,
myFile >> (col1, col2) >> col3;
逗号运算符执行以下操作:如果您对expression1,expression2
expression1
进行了评估,则会expression2
进行评估,并返回expression2
的结果作为结果整个表达expression1,expression2
。
让我们一起检查>>
和,
如何协同工作。 Here您可以看到>>
绑定强于,
(实际上,
具有所有C ++运算符最弱的优先级)。
这意味着
myFile >> (col1, col2) >> col3;
^^^^^^^^^^^^
result is col2
与
具有相同的效果myFile >> col2 >> col3;
因此未使用和col1
。我的编译器(使用-Wall -Wpedantic
)给出了警告
表达式结果未使用[-Wunused-value]