必看!C++教程大全(收藏级)
2021/6/20 12:20:21
本文主要是介绍必看!C++教程大全(收藏级),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、前言
这套C++教程能够很好的帮助你入门,让你掌握C++基础并且打开通向高级C++工程师的大门,通俗易懂深入浅出是这套教程最大的特点,让你能够很轻松地学习C++,还有更多详细进阶教程等你!
二、前面的相关教程
1.https://www.jianshu.com/p/8daec4f04d05
2.https://www.jianshu.com/p/f0b1f52abf77
3.https://www.jianshu.com/p/06dd41023471
4.https://www.jianshu.com/p/c443b461c9c4
5.https://www.jianshu.com/p/d02ba7ec3f30
6.https://www.jianshu.com/p/f93168dd6e2f
7.https://www.jianshu.com/p/491125176a1c
8.https://www.jianshu.com/p/6e1b4db53b24
9.更多详细进阶教程也可以关注微信公众号 “C和C加加” 回复“ZXC”即可获取
三、文件操作
文件-指存储在外部介质上的数据集合,文件按照数据的组织形式不一样,分为两种:ASCII文件(文本/字符),二进制文件(内部格式/字节)ASCII文件输出还是二进制文件,数据形式一样,对于数值数据,输出不同.
1.文件类和对象
C++ 标准类库中有三个类可以用于文件操作,它们统称为文件流类。这三个类是:
ifstream:输入流类,用于从文件中读取数据。
ofstream:输出流类,用于向文件中写人数据。
fstream:输入/输出流类,既可用于从文件中读取数据,又可用于 向文件中写人数据。
文件流对象定义:
#include <fstream> ifstream in; ofstream out; fstream inout;
2.打开文件
打开文件的目的:建立对象与文件的关联,指明文件使用方式
打开文件的两种方式:open函数和构造函数
open函数:void open(const char* szFileName, int mode);
ios::binary 可以和其他模式标记组合使用,例如:
ios::in | ios::binary表示用二进制模式,以读取的方式打开文件。
ios::out | ios::binary表示用二进制模式,以写入的方式打开文件。
流类的构造函数
eg:ifstream::ifstream (const char* szFileName, int mode = ios::in, int);
#include <iostream> #include <fstream> using namespace std; int main() { ifstream inFile("c:\\tmp\\test.txt", ios::in); if (inFile) inFile.close(); else cout << "test.txt doesn't exist" << endl; ofstream oFile("test1.txt", ios::out); if (!oFile) cout << "error 1"; else oFile.close(); fstream oFile2("tmp\\test2.txt", ios::out | ios::in); if (!oFile2) cout << "error 2"; else oFile.close(); return 0; }
3.文本文件的读写
对于文本文件,可以使用 cin、cout 读写。
eg:编写一个程序,将文件 i.txt 中的整数倒序输出到 o.txt。(12 34 56 78 90 -> 90 78 56 34 12)
#include <iostream> #include <fstream> using namespace std; int arr[100]; int main() { int num = 0; ifstream inFile("i.txt", ios::in);//文本模式打开 if (!inFile) return 0;//打开失败 ofstream outFile("o.txt",ios::out); if (!outFile) { outFile.close(); return 0; } int x; while (inFile >> x) arr[num++] = x; for (int i = num - 1; i >= 0; i--) outFile << arr[i] << " "; inFile.close(); outFile.close(); return 0; }
4.二进制文件的读写
用文本方式存储信息不但浪费空间,而且不便于检索。
二进制文件中,信息都占用 sizeof(对象名) 个字节;文本文件中类的成员数据所占用的字节数不同,占用空间一般比二进制的大。
ostream::write 成员函数:ostream & write(char* buffer, int count);
class Person { public: char m_name[20]; int m_age; }; int main() { Person p; ofstream outFile("o.bin", ios::out | ios::binary); while (cin >> p.m_name >> p.m_age) outFile.write((char*)&p, sizeof(p));//强制类型转换 outFile.close(); //heiren 烫烫烫烫烫烫啼 return 0; }
istream::read 成员函数:istream & read(char* buffer, int count);
Person p; ifstream inFile("o.bin", ios::in | ios::binary); //二进制读方式打开 if (!inFile) return 0;//打开文件失败 while (inFile.read((char *)&p, sizeof(p))) cout << p.m_name << " " << p.m_age << endl; inFile.close();
文件流类的 put 和 get 成员函数
#include <iostream> #include <fstream> using namespace std; int main() { ifstream inFile("a.txt", ios::binary | ios::in); if (!inFile) return 0; ofstream outFile("b.txt", ios::binary | ios::out); if (!outFile) { inFile.close(); return 0; } char c; while (inFile.get(c)) //每读一个字符 outFile.put(c); //写一个字符 outFile.close(); inFile.close(); return 0; }
一个字节一个字节地读写,不如一次读写一片内存区域快。每次读写的字节数最好是 512 的整数倍
5.移动和获取文件读写指针
- ifstream 类和 fstream 类有 seekg 成员函数,可以设置文件读指针的位置;
- ofstream 类和 fstream 类有 seekp 成员函数,可以设置文件写指针的位置。
- ifstream 类和 fstream 类还有 tellg 成员函数,能够返回文件读指针的位置;
- ofstream 类和 fstream 类还有 tellp 成员函数,能够返回文件写指针的位置。
函数原型
ostream & seekp (int offset, int mode); istream & seekg (int offset, int mode); //mode有三种:ios::beg-开头往后offset(>=0)字节 ios::cur-当前往前(<=0)/后(>=0)offset字节 ios::end-末尾往前(<=0)offect字节 int tellg(); int tellp(); //seekg 函数将文件读指针定位到文件尾部,再用 tellg 函数获取文件读指针的位置,此位置即为文件长度
举个栗子:折半查找文件,name等于“Heiren”
#include <iostream> #include <fstream> //#include <vector> //#include<cstring> using namespace std; class Person { public: char m_name[20]; int m_age; }; int main() { Person p; ifstream ioFile("p.bin", ios::in | ios::out);//用既读又写的方式打开 if (!ioFile) return 0; ioFile.seekg(0, ios::end); //定位读指针到文件尾部,以便用以后tellg 获取文件长度 int L = 0, R; // L是折半查找范围内第一个记录的序号 // R是折半查找范围内最后一个记录的序号 R = ioFile.tellg() / sizeof(Person) - 1; do { int mid = (L + R) / 2; ioFile.seekg(mid *sizeof(Person), ios::beg); ioFile.read((char *)&p, sizeof(p)); int tmp = strcmp(p.m_name, "Heiren"); if (tmp == 0) { cout << p.m_name << " " << p.m_age; break; } else if (tmp > 0) R = mid - 1; else L = mid + 1; } while (L <= R); ioFile.close(); system("pause"); return 0; }
6.文本文件和二进制文件打开方式的区别
UNIX/Linux 平台中,用文本方式或二进制方式打开文件没有任何区别。
在 UNIX/Linux 平台中,文本文件以\n(ASCII 码为 0x0a)作为换行符号;而在 Windows 平台中,文本文件以连在一起的\r\n(\r的 ASCII 码是 0x0d)作为换行符号。
在 Windows 平台中,如果以文本方式打开文件,当读取文件时,系统会将文件中所有的\r\n转换成一个字符\n,如果文件中有连续的两个字节是 0x0d0a,则系统会丢弃前面的 0x0d 这个字节,只读入 0x0a。当写入文件时,系统会将\n转换成\r\n写入。
用二进制方式打开文件总是最保险的。
7. 更多详细进阶教程可以关注微信公众号 “C和C加加” 回复“ZXC”即可获取
未完待续~~~~
这篇关于必看!C++教程大全(收藏级)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享