@zhengyuhong
2015-06-09T13:01:42.000000Z
字数 2752
阅读 1298
C++11 C++ STL
typedef basic_ifstream<char> ifstream;
ifstream();explicit ifstream (const char* filename, ios_base::openmode mode = ios_base::in);explicit ifstream (const string& filename, ios_base::openmode mode = ios_base::in);ifstream (const ifstream&) = delete;ifstream (ifstream&& x);
void open (const char* filename, ios_base::openmode mode = ios_base::in);void open (const string& filename, ios_base::openmode mode = ios_base::in)
#include <iostream> // std::cout#include <fstream> // std::ifstreamint main () {std::ifstream ifs;ifs.open ("test.txt", std::ifstream::in);//std::ifstream ifs("test.txt", std::ifstream::in) 等价于上面两句char c = ifs.get();while (ifs.good()) {std::cout << c;c = ifs.get();}ifs.close();return 0;}
bool is_open() const;
Check if a file is open.Returns whether the stream is currently associated to a file.
ifstream& operator= (const ifstream&) = delete;ifstream& operator= (ifstream&& rhs);
以空格回车符为分隔符读取数据,
#include <iostream>#include <fstream>#include <string>using namespace std;int main(){ifstream ifs("a.txt");int n;while(ifs>>n) {cout<<n<<endl;}ifs.close();return 0;}//当ifs>>n左右数据类型不匹配时会跳出循环,如//a.txt如果是//1 2 a b c//输出2之后就退出循环结束了。//右侧是stringstream则是另一种情况
ifstream 流 判断文件是否结尾的函数eof(),我个人理解就是,如ifs>>n,当读入文件最后一个数值,文档的eof,good标志依然是正常的,直到流发现没有下一个数值时才设置eof、good标志。这时候流还是保存上次的值,所以最后可能会读入两次最后的值。如下代码就是读入了两次。
ifstream ifs("a.txt");int n;while(ifs.good()) { //while(ifs.eof())ifs>>ncout<<n<<endl;}ifs.close();
可以如下改写
ifstream ifs("a.txt");int n;ifs>>nwhile(ifs.good()) { //while(ifs.eof())cout<<n<<endl;ifs>>n}ifs.close();
如此现读再判断就正常了。个人还是倾向于上面while(ifs>>n)的写法。while判断语句的真实判断对象是ifs,也就是判断当前是否存在有效的输入流。譬如读完最后一个数据后再读时,while(ifs>>n)就会判断错误,因为ifs>>n无法读取数据,是一个无效流,在operator>> API 中清楚看到返回值是流的引用,所以使用while(ifs>>n)判断是否结束读取简单易用。同理使用string中的getline时也可以使用while(getline(ifs,str))很容易就可以判断了。
Public member functions inherited from istream
istream& getline (char* s, streamsize n );istream& getline (char* s, streamsize n, char delim );
getline function in string
istream& getline (istream& is, string& str, char delim);istream& getline (istream&& is, string& str, char delim);istream& getline (istream& is, string& str);istream& getline (istream&& is, string& str);
example
#include <iostream>#include <string> //std::getlinemain (){std::string name;std::cout << "Please, enter your full name: ";std::getline (std::cin,name);std::cout << "Hello, " << name << "!\n";return 0;}
ofstream();explicit ofstream (const char* filename, ios_base::openmode mode = ios_base::out);explicit ofstream (const string& filename, ios_base::openmode mode = ios_base::out);
mode = std::ofstream::in,out,binary,ate,app
输出很简单,想输出神马,就ofs<<data就行了。最后关闭输出流。done
#include <fstream> // std::ofstreamint main () {std::ofstream ofs;ofs.open ("test.txt", std::ofstream::out | std::ofstream::app);ofs << " more lorem ipsum";ofs.close();return 0;}
