十、C++之文件操作
一、标准输入流(cin)
1.1 cin的常见用法
/* cin.get() 一次只能读取一个字符 cin.get(一个参数) 读一个字符 cin.get(两个参数) 可以读取字符串, 读取字符串不会读取换行,遗留在缓冲区 cin.getline() 会读取换行符,但是会把换行符给扔掉 cin.ignore() 忽略,代表忽略字符 cin.ignore(N); 代表忽略N个字符 cin.peek() 偷窥, 偷看一眼获取的字符,然后再放回缓冲区,缓冲区中的数据未变 cin.putback() 放回, 读取之后把字符放回缓冲区 */ #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<string> using namespace std; // cin.get() 一次只能读取一个字符 void test01() { char c = cin.get(); // as cout << "c = " << c << endl; // a c = cin.get(); cout << "c = " << c << endl; // s cout << "c = " << c << endl; // \n } // cin.get(两个参数), 可以读取字符串, 读取字符串不会读取换行,遗留在缓冲区 void test02() { char buf[1024]; cin.get(buf, 1024); // hello world char c = cin.get(); if (c == '\n') { cout << "换行还在缓冲区" << endl; // 换行还在缓冲区 } else { cout << "换行不在缓冲区" << endl; } cout << "bug = " << buf << endl; // hello world } // cin.getline() 会读取换行符,但是会把换行符给扔掉 void test03() { char buf[1024]; cin.getline(buf, 1024); char c = cin.get(); // 阻塞在这里,等待输入 } // cin.ignore() 忽略,代表忽略字符 cin.ignore(N); 代表忽略N个字符 void test04() { cin.ignore(); // as char c = cin.get(); cout << "c = " << c << endl; // s } // cin.peek() 偷窥, 偷看一眼获取的字符,然后再放回缓冲区,缓冲区中的数据未变 void test05() { char c = cin.peek(); // as cout << "c = " << c << endl; // c = a c = cin.get(); cout << "c = " << c << endl; // c = a } // cin.putback() 放回 void test06() { char c = cin.get(); // hello world cin.putback(c); char buf[1024]; cin.getline(buf, 1024); cout << "buf = " << buf << endl; // buf = hello world } int main() { // test01(); // test02(); // test03(); // test04(); // test05(); test06(); return EXIT_SUCCESS; }
1.2 案例
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<string> using namespace std; // 案例一、判断用户输入的是字符串还是数字 void test() { cout << "请输入一串数字或者字符串" << endl; // 判断第一个字符是字符还是数字 char c = cin.peek(); if (c >= '0' & c <= '9') { int num; cin >> num; cout << "输入的是数字, 输入的数字是: " << num << endl; } else { char buf[1024]; cin >> buf; cout << "输入的是字符串, 字符串为: " << buf << endl; } } int main() { test(); return EXIT_SUCCESS; }
/* cin.clear() 重置标志位 cin.fail() 查看标志位 */ #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<string> using namespace std; // 让用户输入 1-10的数字,如果输入有误,重新输入 void test() { int num; cout << "请输入一个 1 - 10 的数字" << endl; while (true) { cin >> num; // 如果输入的是 字符的话, 那么标志位是 1,就会进入死循环,所以要重置标志位 if (num > 0 && num <= 10) { cout << "输入的数字为: " << num << endl; break; } // 重置标志位 cin.clear(); cout << "cin 输入 int 类型的标志位: "<< cin.fail() << endl; // 输入 int 类型的标志位: 0. 如果输入的是字符,标志位是 1,没有重置标志位,就会死循环 } } int main() { test(); return EXIT_SUCCESS; }
二、标准输出流(cout)
2.1 cout的使用
/* cout.put(); 向缓冲区写字符 cout.write(); 从 buffer中写num个字节到当前输出流中 */ #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<string> using namespace std; // cout.put(); 向缓冲区写字符 void test01() { cout.put('a').put('b'); // ab } // cout.write() 从 buffer中写num个字节到当前输出流中 void test02() { char buf[1024] = "hello world"; cout.write(buf, strlen(buf)); // hello world } int main() { test01(); test02(); return EXIT_SUCCESS; }
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<string> using namespace std; // 流成员函数 void test() { int num = 99; cout.width(20); // 20个字节的区域, 数字在最右侧 cout.fill('*'); // 用 * 填充空格 cout.setf(ios::left); // 设置格式, 输出的内容左对齐 cout.unsetf(ios::dec); // 卸载十进制 cout.setf(ios::hex); // 安装了十六进制,十六进制下的 99 cout.setf(ios::showbase); // 强制输出整数的基数 0 0x cout.setf(ios::hex); // 同理 八进制 cout.setf(ios::oct); // 同理十进制 cout << "num = " << num << endl; } int main() { test(); return EXIT_SUCCESS; }
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<string> #include<iomanip> // 使用控制符的头文件 using namespace std; void test() { int num = 99; cout << setw(20) << setfill('~') << setiosflags(ios::showbase) << setiosflags(ios::left) << hex << num << endl; } int main() { test(); return EXIT_SUCCESS; }
/* 写文件: ofstream 读文件: ifstream */ #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<string> #include<fstream> using namespace std; // 写文件 void test01() { // 以输出的方式打开文件, 方式一 // ofstream ofs("1.txt", ios::out | ios::trunc); // 方式二 ofstream ofs; ofs.open("1.txt", ios::out | ios::trunc); // 判断是否打开成功 if (!ofs.is_open()) { cout << "打开失败" << endl; } ofs << "姓名:王勇" << endl; ofs << "年龄:27" << endl; ofs.close(); } // 读文件 void test02() { ifstream ifs; ifs.open("1.txt", ios::in); // 判断是否打开成功 if (!ifs.is_open()) { cout << "打开失败" << endl; } // 第一种方式 推荐 //char buf1[1024]; //while (ifs>>buf1) // 按行读取 //{ // cout << buf1 << endl; //} // 第二种方式 不推荐 //char buf2[1024]; //while (!ifs.eof()) // eof读到文件末尾 //{ // ifs.getline(buf2, sizeof(buf2)); // cout << buf2 << endl; //} // 第三种方式 更不推荐 char c; while ((c = ifs.get()) != EOF) // EOF 文件尾 { cout << c; } ifs.cloase(); } int main() { test01(); test02(); return EXIT_SUCCESS; }