0712-----C++Primer听课笔记----------IO流

0.不要试着从C++编译器的角度理解问题,而是从程序的语义着手。

1.控制台标准输入输出流的使用

1.1IO对象不可复制或者赋值。因此使用IO对象做参数必须使用非const 引用参数(非const因为对IO对象的读写会改变其状态)。

1.2当cin输入非法数据时,fail置为1,当cin遇到文件结尾(ctrl+D)时, fail和eof都为1。

#include <iostream>
#include <string>
#include <vector>

using namespace std;

/*
 *num是int型,当输入字符串时 cin >> num  会失败
 * 这种情况下会对num做一个初始化的操作,并且之后cin也不可用
 */

int main(int argc, const char *argv[])
{
    int num;
    cin >> num ;
    cout << num << endl;

    cout << "cin.good = " << cin.good() << endl;
    cout << "cin.bad = " << cin.bad() << endl;
    cout << "cin.eof = " << cin.eof() << endl;
    cout << "cin.fail = " << cin.fail() << endl;

    cout  << "-------------------"  << endl;

    string s;
    cin  >> s;
    cout << s << endl;

    cout << "cin.good = " << cin.good() << endl;
    cout << "cin.bad = " << cin.bad() << endl;
    cout << "cin.eof = " << cin.eof() << endl;
    cout << "cin.fail = " << cin.fail() << endl;
    return 0;
}

1.3对于cin 可用的时候为TRUE, 不可用的时候为FALSE。

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <stdexcept>

using namespace std;
/*
 *文件流对象可用时为true 不可用时为false
 */

ifstream & open_file(ifstream &is, const string &file){
    is.close();
    is.clear();
    is.open(file.c_str());
    return is;
}

int main(int argc, const char *argv[])
{

    ifstream is;
    string filename("a.txt");
    if(!open_file(is, filename)){
        throw std::runtime_error("file open filed!");
    }
    is.close();
    return 0;
}

2.文件流的运用

2.1 ifstream  输入文件流(注意这里的输入输出是相对于程序来说的)

2.1.1 读一行显示到终端

#include <iostream>
#include <string>
#include <vector>
#include <fstream>

using namespace std;
/*
 *每次从文件中读一行 然后输出到屏幕
 */
int main(int argc, const char *argv[])
{
    ifstream is;
    is.open("a.txt");
    string line;
    while(getline(is, line)){
        cout << line << endl;
    }
    is.close(); //文件流最后要关闭
    return 0;
}

2.1.2 每次读一个单词 存入vector容器中

#include <string>
#include <vector>
#include <fstream>

using namespace std;
/*
 *读取文件中的单词 并存储到vector容器中
 */
int main(int argc, const char *argv[])
{
    string filename = "a.txt";
    ifstream is;
    is.open(filename.c_str());
    vector<string> vec;
    string word;
    while(is >> word){
        vec.push_back(word);
    }
    is.close();
    cout << "word_num = " << vec.size() << endl;
    for(vector<string>::iterator it = vec.begin(); it != vec.end(); ++it){
        cout << *it << " ";
    }
    cout << endl;
    return 0;
}

2.2 ostream  输出文件流

2.2.2 将vector中存储的字符串 写到文件中

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using namespace std;

int main(int argc, const char *argv[])
{
    ofstream os;
    os.open("out.txt");
    vector<string> vec;
    vec.push_back("hello");
    vec.push_back("world");
    for(vector<string>::iterator it = vec.begin(); it != vec.end(); ++it){
        os << *it << endl;
    }
    os.close();
    return 0;
}

1.2.3 将一个文件的内容拷贝到另外一个文件中去

#include <iostream>
#include <string>
#include <vector>
#include <fstream>

using namespace std;

int main(int argc, const char *argv[])
{
    ifstream is;
    ofstream os;
    is.open("a.txt");
    os.open("b.txt");
    string line;
    while(getline(is, line) ){
        os << line << endl;
    }
    os.close();
    is.close();
    return 0;
}

3.字符串流

3.1 从文件中读一行存到vector中后,并把一行中的单词存到另一个vector中。

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <fstream>

using namespace std;

int main(int argc, const char *argv[])
{

    ifstream is;
    vector<string> lines, words;
    is.open("a.txt");
    istringstream ss;
    string line, word;
    while(getline(is, line)){
        lines.push_back(line);
        ss.str(line); //
        while(ss >> word){
            words.push_back(word);
        }
       ss.clear();
    }
    is.close();
    for(vector<string>::iterator it = lines.begin(); it != lines.end(); ++it){
        cout << *it << endl;
    }
    cout << "------------------------" << endl;
    for(vector<string>::iterator it = words.begin(); it != words.end(); ++it){
        cout << *it << " ";
    }
    cout << endl;
    return 0;
}

0712-----C++Primer听课笔记----------IO流

时间: 2024-11-03 21:37:35

0712-----C++Primer听课笔记----------IO流的相关文章

0718-----C++Primer听课笔记----------运算符重载

0.两个要点 a) 一个空类,编译器自动合成默认无参构造函数.析构函数.拷贝构造函数.赋值运算符. b) 在编写类的时候,必须严格区分对象是否可复制. 1.运算符重载之 string类 1.1 运算符重载的几个要点: a) 运算符重载可以有成员函数和友元函数的形式,后者比前者多一个参数. b) =和+=必须重载为成员函数的形式(不太理解原因). c) 输入和输出必须为友元函数的形式.而且输入操作符要考虑输入失败的情况. d) 运算符重载为成员函数的形式,那么该操作符的第一个操作数必然为该类的对象

0722-----C++Primer听课笔记----------虚函数和模板

1.虚指针和虚函数表 1.1 不含有任何数据成员或者虚函数的class或者struct大小为1,含有虚函数的对象在基地址部分有一个vptr,指向虚函数表,因此大小为4个字节. 1.2 动态绑定的原理:假设派生类和基类存在覆盖的关系(基类中定义了虚函数),那么派生类在虚函数表中,会覆盖掉基类相应的虚函数.当程序执行的时候,根据基类指针找到vptr,根据vptr找到vtable,然后找到相应的版本去执行.所以执行的是覆盖的版本,而具体被哪个版本覆盖是由具体的对象类型所决定的,所以才实现了根据对象的具

0801-----C++Primer听课笔记----------C++11新特性 function 和 bind 的简单使用

1.function 和 函数指针 1.1 function有函数指针的功能,但是使用起来明显比函数指针更加灵活和方便. 1.2 函数指针和function的用法实例. 1.2.1 函数指针首先要清楚函数指针的类型,如void (*)(int, char)等,然后声明一函数指针变量直接调用即可. #include <iostream> using namespace std; /* * 函数指针的用法 */ void test(int i,double j){ cout << i

0722-----C++Primer听课笔记----------句柄类和智能指针

1.再说智能指针 1.1  为什么要用智能指针?对于一个指针,它指向一个动态分配内存的对象,若同时有多个指针指向该对象,那么当我们delete的时候,就会出现delete 一个无效内存的错误,因为该对象已经被delete过了,所以这就造成了错误.针对这一情况,我们想到,new 和 delete 必须是成对出现的,那么联想到类里面,很容易想到这个构造函数和析构函数也是成对出现的,对于每一个对象,初始化的时候会调用构造函数,而销毁的时候必然要调用析构函数.因此我们就可以对 指针 进行封装,将该指针的

0716-----C++Primer听课笔记----------STL之顺序容器、迭代器

1. 顺序容器的初始化操作 1.1 顺序容器(vector,list,deque)的五种初始化方法,以 vector 为例. #include <iostream> #include <string> #include <vector> using namespace std; int main(int argc, const char *argv[]) { //1.定义空数组 然后后面追加 vector<string> vec1; vec1.push_ba

0713-----C++Primer听课笔记----------类和对象

1.要求:将一篇文章录入,然后实现查询: a)查询可以输入字符或者字符串 b)将包含它们的单词输出 c)允许重复 d)如果输入查询有空格,当多个处理 Ex: 输入ro,应该打印出“microsift” 输入”he wr”,则查询两次 1.1  不用类实现 #include <iostream> #include <string> #include <vector> #include <fstream> #include <stdexcept> u

0715-----C++Primer听课笔记-----------函数指针 、单例模式

1.函数指针 1.1 普通成员函数指针包含类名信息以及const属性,指向具体函数是必须加上&符号. #include <iostream> using namespace std; class Test{ public: void setValue(const string &s, int a){ s_ = s; a_ = a; } void print() const{ cout << s_ << endl << a_ <<

Java笔记-IO流的运用

1.InputStream和System.in(Scanner) InputStream 输出流以字节为单位来获取数据,且需要复杂的判断并创建字节数组作为缓冲 另外字节转换为字符时容易出现中文乱码的情况:Scanner Java扫描器类,可以从输入流中读取指定类型的数据或字符串. 对于字符数据的读取,应该使用Scanner扫描器进行封装,然后获取字符串类型的数据 2. out和err out和err是System类的两个static类成员变量: out:主要是输出调试信息的输出流,以黑色显示 e

0717-----C++Primer听课笔记----------STL之关联容器

1.Map 1.1 map<K, V>是一种pair的容器,pair的种类是pair<K, V>.map采用下标访问一个已存在的key, 会更新value,访问map中不存在的元素时,会增加一个新的键值对.map中的元素按照key进行从小到大排列.map的底层实现是采用二叉树,一般是使用红黑树. #include <iostream> #include <string> #include <map> using namespace std; /*