//C++学习笔记_09 IO流 #include<cstdio> #include<cstring> #include<iomanip> #include<iostream> #include<fstream> #include<sstream> using namespace std; void Test_iostream() { //输出字符串到控制台, 怎么输出的? //把 "Hello world!" 这串数据,送到 cout 对象里面去 ==》 在控制台进行输出 cout << "Hello world!" << endl; int x; //把cin对象中的数据,送到 x 里面来 ==》控制台输入数据 --> x 接受 cin >> x; printf("x=%d\n", x); //输出10进制数 printf("x=%x\n", x); //输出16进制 cout << "x=" << x << endl; //默认输出10进制 cout << "x=" << hex << x << "; " << dec << x << endl; //输出16进制 //八进制 oct //十进制 dec } void Test_fstream() { //输出文件流 --> 把数据,从内存 输出到文件 --> 写文件操作 ofstream ofs("a.txt"); //相对路径:默认使用当前程序路径 //我们也可以使用绝对路径 c:\xxx\a.txt //使用绝对路径的时候要注意 \ 是转义字符 //我们应该写 ofstream ofs("c:\\xxx\\a.txt") if (ofs.is_open()){ cout << "1 3 4 7 9" << endl; //输出给 cout ofs << "1 3 4 7 9" << endl; //输出给 ofs ofs << "2 4 6 8 10" << endl; //写文件的时候,想把这一行,写到文件开头 --》使用 seekp 函数重新定位指针 ofs.seekp(0, ios::beg); //第一个参数,表示偏移量: 负数-往前偏移, 正数-往后偏移 //第二个参数,表示基址:ios::beg 文件开始,ios::end 文件结尾, ios::cur 文件当前位置 ofs << "1 2 3 4 5" << endl;//--》把原来的第一行 1 3 4 7 9 覆盖了 } ofs.close(); //我们需要手动关闭文件,不会在析构函数里面关闭 //因为我们一个 ofs 可以多次打开文件 ofs.open("b.txt"); ofs << "hello world" << endl; ofs << "helloC++" << endl; ofs.close(); //读文件: 文件输入流: 把数据输入到内存 ifstream ifs("a.txt"); int arr[5] = {0}; int i = 0; if (ifs.is_open()){ //我们想读第二行数据, 把文件偏移到第二行 ifs.seekg(10, ios::beg);//get:读 //往后偏移 10 个 字符 //判断文件末尾 ifs.eof() 返回ture 表示文件指针指到了结束位置 while (!ifs.eof() && i < 5){ //cin >> arr[i]; ifs >> arr[i];i++; } } ifs.close(); cout << "arr: "; for (i = 0; i < 5; i++) {cout << arr[i] << " ";} cout << endl << endl; //文件的打开方式: //ios::in 读文件 //ios::out 写文件 //ios::app 追加, 打开文件的时候,文件指针指到了文件末尾 //ios::binary 二进制打开文件(二进制读写文件,文件不会失真) //ios::trunc 废弃当前文件内容:写文件的时候--》先清空文件再写 char szBuf[100]; //fstream fs("b.txt", ios::in | ios::trunc); //ios::in 和 ios::trunc 冲突 fstream fs("b.txt", ios::in); //fs.good() 文件能正常操作 1, 否则为 0 //fs.bad() 文件出错了 返回 1 //如果遇到 bad 返回 1 ---》 fs.clear() 重置 --》重置后就可以重新打开文件进行操作了 cout << "good? " << fs.good() << endl; cout << "bad ? " << fs.bad() << endl; if (fs.is_open()){ //fs >> szBuf; //cout << "szBuf:" << szBuf << endl; fs << "HelloC++"; //fs >> szBuf; //cout << "szBuf:" << szBuf << endl; } else cout << "open file failed!" << endl << endl; fs.close(); //其它读写文件的方式 //put(char) 函数, 在文件指针位置写一个字符 char szStr[100] = "The end"; fs.open("a.txt", ios::app); fs.put('E'); //写一个字符 fs.write(szStr, strlen(szStr)); //写一段字符串 fs.close(); fs.open("b.txt", ios::in); fs.get(szStr, 100); //可以读一段字符串, 最多读 100个字符,遇到 \n 结束 cout << szStr << endl << endl; fs.seekg(0, ios::beg); //指针跳到文件开始位置 fs.get(szStr, 100, '+'); //读一段字符,最多读100个字符,遇到 '+' 结束 cout << szStr << endl << endl; fs.seekg(0, ios::beg); fs.read(szStr, 100); //按块读取,读满 100 个字符 (除非到了文件末尾) cout << szStr << endl << endl; fs.close(); return; } void Test_sstream() { string ss("abcd"); istringstream istrs(ss); //使用 ss 这个字符串初始化流 char szArr[10]; istrs >> szArr; //从字符串流中读取数据,类似与读写文件,不过这里是流数据在内存中 cout << "szArr:" << szArr << endl;//错误输出 有缓冲 cout << "istrs:" << istrs.str() << endl;//普通输出 无缓冲 ostringstream ostrs(ss); char szBuf[] = "Hello world"; ostrs << szBuf; //把szBuf 写入到 字符串流,也就是写到了 ss 中 cout << "ss :" << ss << endl; } int main() { //Test_iostream(); //Test_fstream(); Test_sstream(); system("pause"); return 0; }