#include<iostream>
#include<fstream>
#include<iterator>
#include<vector>
// it is a good idea to create an structure to hold the data you will
// be working with. In this case I am creating a bare-bones struct
// containing a single data element
struct entry {
double data[3];
};
// when you have an structure, you can overload the >> operator; this
// will allow you to simplify later calls (as you will see below). In
// this case, because your data file contains a "dummy" character I
// use a dummy string. Notice that the return type is bool, and it
// means "I was able to read what you wanted me to read", in this case
// a line with one string and three doubles (because the type of each
// e.data[k] is "double")
bool operator>>(std::istream& is, entry& e) {
std::string dummy;
return is>>dummy>>e.data[0]>>e.data[1]>>e.data[2];
}
int main() {
// create a vector to hold the entries (notice that "entry" is the
// data type you created above)
std::vector<entry> entries;
{ // the bracket on the left will provide a "scope" for the "fp"
// variable. When the scope ends, "fp" will be automatically
// destroyed. For "fp" that means that the "close()" method will
// be called upon destruction, and you don't need to worry about
// ensuring that your files are closed (to lear more about this
// google for RAII)
std::ifstream fp("test.txt");
// the iterators DO NOT REQUIRE A LOOP (they "provide" the loop;
// they are used precisely to avoid coding the loop)
std::copy(std::istream_iterator<entry>(fp),
std::istream_iterator<entry>(),
std::back_inserter<std::vector<entry>>(entries));
// notice that the back inserter will insert "entry" types into
// the "entries" vector as long as it can continue reading them
// (that is, as long as ">>" continues to return "true"
} // the bracket on the left is finishing the scope I talked about
// above. Past this point fp no longer exists, and the file has
// been closed
// off you go - you have your vector full of "entry" instances which
// you can use normally
std::cout<<"read "<<entries.size()<<" entries: "<<std::endl;
for(auto e:entries) {
std::cout<<e.data[0]<<", "<<e.data[1]<<", "<<e.data[2]<<std::endl;
}
return 0;
}
我使用 gcc 4.7.2 编译了这个源代码:
g++ example.cpp -std=c++11
使用与您提供的文件完全相同的文件(我称之为“test.txt”),我得到以下信息:
read 2 entries:
0, 0, 1
1, 0, 1