Notes from C++ Primer

File State

Condition state is used to manage stream state, which indicates if the stream is available or recoverable.

State of stream is descripted by three member function: bad, fail, eof and good.

  • bad(): unrecoverable error. If the stream state is badbit, then it can't be used again. bad() returns true.
  • fail(): recoverable error. If the stream state is failbit, fail() returns true.
  • eof(): when stream meets the end-of-file. eofbit will be set. Also, the stream will be set failbit at the same time.
  • good(): the state of stream. If one of bad, fail, eof  is true, the good will return false, otherwise return true.

There're two operations to change the condition state: clear, setstate.

  • clear: reset the stream to be available.
  • setstate: open one of specified condition state.

The mangement of stream can be like this:

int ival;

// read cin and test only for EOF; loop is executed even if there are other IO failures
while(cin >> word, !cin.eof())
{
if(cin.bad()) // input stream is corrupted; bail out
throw runtime_error("IO stream corrupted"); if(cin.fail()) // bad input
{
cerr << "bad data, try again"; // warn the user
cin.clear(istream::failbit); // reset the stream
continue;
} // ok to process ival
...
}

Member function rdstate() returns the current state of stream. The below example also display how to set the state of stream:

// remember current state of cin
istream::iostate old_state = cin.rdstate(); cin.clear();
process_input(); // use cin cin.clear(old_state); // now reset cin to old state ... // sets both the badbit and the failbit
is.setstate(ifstream::badbit | ifstream::failbit);

Use of File Stream

Assume ifle and ofile is the string object storing the names of input and output files' namess.

string ifile = "inputFile.txt";
string ofile = "outputFile.txt";

Then the use of file stream is like this:

// construct an ifstream and bind it to the file named ifile
ifstream infile(ifile.c_str());
// ofstream output file object to write file named ofile
ofstream outfile(ofile.c_str());

Also, we can define unbound input and output file stream first, and then use open function to boud the file we'll access:

ifstream infile;                // unbound input file stream
ofstream outfile; // unbound output file stream infile.open("in"); // open file named "in" in the current directory
outfile.open("out"); // open file named "out" in the current directory

After opening the file, we need to check if it is successful being opened:

// check that the open succeeded
if(!infile){
cerr << "error: unable to open input file: "
<< infile << endl; return -1;
}

Rebound File Stream with New File

If we want to bound the fstream with another file, we need to close the current file first, and then bound with another file:

ifstream infile("in");          // open file named "in" for reading
infile.close(); // closes "in"
infile.open("next"); // open file named "next" for reading

Clear File Stream Status

Opening all file names in a string vector, one direct version is:

vector<string> files;
...
vector<string>::const_iterator it = files.begin();
string s; // string buffer // for each file in the vector
while(it != files.end()){
ifstream input(it->c_str()); // open the file // if the file is ok, read and "process" the input
if(!input)
break; // error: bail out!
while(input >> s) // do the work on this file
process(s);
++it; // increament iterator to get next file
}

More efficient way but with much more accurate operation version:

ifstream input;
vector<string>::const_iterator it = files.begin(); // for each file in the vector
while(it != files.end()){
input.open(it->c_str()); // open the file // if the file is ok, read and "process" the input
if(!input)
break; // error: bail out!
while(input >> s) // do the work on this file
process(s); input.close(); // close file when we're done with it
input.clear(); // reset state to ok
++it;
}

File Mode

When you use ofstream to open file, the only way to store existing data is to set the app mode explicitly.

// output mode by default; truncates file named "file1"
ofstream outfile("file1"); // equivalent effect: "file1" is explicitly truncated
ofstream oufile2("file1", ofstream::out | ofstream::trunc); // append mode: adds new data at end of existing file named "file2"
ofstream appfile("file2", ofstream::app);

File mode is the attribute of file, not stream

ofstream outfile;
// output mode set to out, "scratchpad" truncated because of after definition
outfile.open("scratchpad", ofstream::out);
outfile.close(); // close outfile so we can rebind it // appends to file named "precious"
outfile.open("precious", ofstream::app);
outfile.close(); // output mode set by default, "out" truncated
outfile.open("out");

Input and Output File的更多相关文章

  1. Filebeat之input和output(包含Elasticsearch Output 、Logstash Output、 Redis Output、 File Output和 Console Output)

    前提博客 https://i.cnblogs.com/posts?categoryid=972313 Filebeat啊,根据input来监控数据,根据output来使用数据!!! Filebeat的 ...

  2. Python Tutorial 学习(七)--Input and Output

    7. Input and Output Python里面有多种方式展示程序的输出.或是用便于人阅读的方式打印出来,或是存储到文件中以便将来使用.... 本章将对这些方法予以讨论. 两种将其他类型的值转 ...

  3. [20171128]rman Input or output Memory Buffers.txt

    [20171128]rman Input or output Memory Buffers.txt --//做一个简单测试rman 的Input or output Memory Buffers. 1 ...

  4. Java中的IO流,Input和Output的用法,字节流和字符流的区别

    Java中的IO流:就是内存与设备之间的输入和输出操作就成为IO操作,也就是IO流.内存中的数据持久化到设备上-------->输出(Output).把 硬盘上的数据读取到内存中,这种操作 成为 ...

  5. 标准库 - 输入输出处理(input and output facilities) lua

    标准库 - 输入输出处理(input and output facilities)责任编辑:cynthia作者:来自ITPUB论坛 2008-02-18 文本Tag: Lua [IT168 技术文档] ...

  6. [译]The Python Tutorial#7. Input and Output

    [译]The Python Tutorial#Input and Output Python中有多种展示程序输出的方式:数据可以以人类可读的方式打印出来,也可以输出到文件中以后使用.本章节将会详细讨论 ...

  7. C lang:character input and output (I/O)

    Xx_Introduction Character input and output is by more line character conpose of the text flow  Defin ...

  8. 7. Input and Output

    7. Input and Output There are several ways to present the output of a program; data can be printed i ...

  9. Compiler Error Message: CS0016: Could not write to output file 回绝访问

    Compiler Error Message: CS0016: Could not write to output file 'c:\Windows...dll' 拒绝访问 C:\Windows\Te ...

随机推荐

  1. maven构建SSM框架中pom.xml文件配置

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  2. JavaScript学习-2循环

    文章目录 ----------①console函数 ----------②for循环 ----------③跳出循环 ----------④练习题:口诀表 ----------⑤练习题:幼兔 ---- ...

  3. 剑指offer例题——反转链表

    题目描述 输入一个链表,反转链表,输出新链表的表头 程序编写 将链表反转 public class Solution { public ListNode ReverseList(ListNode he ...

  4. 微擎系统jssdk系统快速签名变量

    jssdkconfig = {php echo json_encode($_W['account']['jssdkconfig']);} || { jsApiList:[] };    jssdkco ...

  5. spring proxy-target-class

    <tx:annotation-driven transaction-manager="transactionManager"                          ...

  6. Java学习笔记(二十一):类型转换和instanceof关键字

    基本数据类型转换: 自动类型转换:把大类型的数据赋值给大类型的变量(此时的大小指的是容量的范围) byte b = 12; //byte是一个字节 int i = b; //int是四个字节 强制类型 ...

  7. oracle随机数(转)

    1.从表中随机取记录SELECT * FROM (SELECT * FROM STUDENT ORDER BY DBMS_RANDOM.RANDOM) WHERE ROWNUM < 4--表示从 ...

  8. Python设计模式 - UML - 包图(Package Diagram)

    简介 包图是对各个包及包之间关系的描述,展现系统中模块与模块之间的依赖关系.一个包图可以由任何一种UML图组成,可容纳的元素有类.接口.组件.用例和其他包等.包是UML中非常常用的元素,主要作用是分类 ...

  9. java项目测试或者不使用request,如何获取webroot路径

    1.使用jdk中的方法,然后根据项目编译后的文件存在的位置,获取到classes目录,然后向上级查询获取String path = EngineTest.class.getResource(" ...

  10. 426. Convert Binary Search Tree to Sorted Doubly Linked List把bst变成双向链表

    [抄题]: Convert a BST to a sorted circular doubly-linked list in-place. Think of the left and right po ...