C++文件读写
2021/10/1 20:13:13
本文主要是介绍C++文件读写,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录
文件的分类
外部文件和内部文件
外部文件
内部文件
文件分类
文本文件
二进制文件
文件流类及对象
头文件
文件打开关闭
打开文件
文件打开方式
关闭文件
文件读写
get和put文件读写
getline读取文件
二进制文件读写(read和write)
文件数据定位
文件指针成员函数
EOF
C中有sprintf和sscanf,C++也有自己的对字符串读写.
文件的分类
外部文件和内部文件
外部文件
硬盘,U盘等,在磁盘上的文件都是外部文件.
内部文件
在程序中运行使用的文件,也就是文件流对象,也就是内存中的数据
文件分类
文本文件
也就是ASCII文件,一个ASCII码就是一个字节
二进制文件
就是计算机存储的原样放到磁盘上的文件
也就是说111111,在文本文件中占6个字节(六个1每一个占一个字节),在二进制文件中占4个字节(一个int类型)
文件流类及对象
标准库提供了标准输入(istream)输出(ostream)输入输出(iostream)
而对于文件操作有
ifstream,从istream派生而来,文件读取
ofstream,从ostream派生而来,文件写入
fstream,从iostream派生而来,文件读写
头文件
#include <fstream>
文件打开关闭
打开文件
ofstream out; //定义ofstream对象
out.open("路径/文件名",文件打开方式); //打开文件
ofstream out("路径/文件名",文件打开方式); //这样也可以,构造函数
文件打开方式
ios::in 以写的形式打开文件
ios::out 以读的形式打开文件,没有文件,创建有的话清除文件内容
ios::app 以追加的形式打开文件,没有文件,创建
ios::ate 打开一个已有的文件,并将文件读指针指向文件末尾
ios:: trunc 打开文件时会清空内部存储的所有数据,单独使用时与 ios::out 相同
ios::binary 以二进制方式打开文件.若不指定此模式,则以文本模式打开
fstream 类下 ios::in | ios::out 打开已存在的文件,既可读取其内容,也可向其写入数据.文件刚打开时,原有内容保持不变.如果文件不存在,则打开出错
fstream 类下 ios::in | ios::out | ios::trunc 打开已存在的文件,既可读取其内容,也可向其写入数据.如果文件不存在,创建新文件.文件存在,清空数据.
文件打开失败时,返回0可以用来检测文件是否打开成功.
关闭文件
文件流对象.close();
文件读写
#include <iostream> #include <fstream> using namespace std; int main() { //打开文件写入,文件不存在创建文件,文件存在清空文件 fstream fout("test.txt", ios::out); //判断是否打开成功 if (!fout) { cerr << "fout"; exit(1); //这个是不是没说过,正常退出返回0,非0非正常退出. } //写入文件 fout << "床前明月光,\n疑是 地上霜.\n举头望明月,\n低头思故乡.\n"; //关闭文件 fout.close(); //打开文件读取,文件不存在返回0 fstream fin("test.txt", ios::in); if (!fin) { cerr << "fin"; exit(1); } string str2; //读取文件 fin >> str2; cout << "读取到的文件内容:" << endl; cout << str2 << endl; //关闭文件 fin.close(); return 0; }
输出信息
文件信息
不能直接读取空格回车,也就是空白字符.
因为是继承而来,标准的输入输出成员函数(get,getline,write,put,read)同样适用与文件,也同样遵守他们的规则,上述代码同样不会从文件中读取空白字符.
get和put文件读写
可以读取空白字符,换行符空格
get函数读取文件时,虽然写成一个字节读取,但是实际上他是一次读取一个扇区,然后只是从内存中获得数据,这样可以提高速度也会减少硬盘消耗.
这些知识应该是在计算机组成原理中,也许是计算机基础中.记不太清了.
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { fstream fout("test.txt", ios::out); if (!fout) { cerr << "fin"; exit(1); } string str = "1234567\n 234567\n123456"; //写文件 一次写一个字符可以写入空白字符 for (int i = 0; i < str.size(); ++i) { fout.put(str[i]); } fout.close(); //此处文件如果不关闭,文件指针在最后不会读到我们想要的数据.后面会说 fstream fin("test.txt", ios::in); if (!fin) { cerr << "fin"; exit(1); } char ch = 0; //C中说过EOF(文件结尾),一般这个值是-1,但是他也表示无效的字符所以可以这么判断结束 while (fin.get(ch)) { cout << ch; } fin.close(); return 0; }
输出信息
文件信息
getline读取文件
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { fstream fout("test.txt", ios::out); if (!fout) { cerr << "fin"; exit(1); } string str = "1234567\n 234567\n123456"; //写文件 一次写一个字符可以写入空白字符 for (int i = 0; i < str.size(); ++i) { fout.put(str[i]); } fout.close(); //此处文件如果不关闭,文件指针在最后不会读到我们想要的数据.后面会说 fstream fin("test.txt", ios::in); if (!fin) { cerr << "fin"; exit(1); } string str2; //他会读取空格舍弃换行符 while (getline(fin,str2)) { cout << str2; } fin.close(); return 0; }
输出信息
文件信息
二进制文件读写(read和write)
#include <iostream> #include <fstream> using namespace std; struct Student { char m_name[64]; int m_age; int m_score; }; int main() { Student *stu = new Student[3]; stu[0] = { "小华",11,111 }; stu[1] = { "小明",22,222 }; stu[2] = { "小兰",33,333 }; fstream fout("test.txt", ios::out | ios::binary); if (!fout) { cerr << "fout"; exit(1); } //写文件 第一个参数要求是char*所以我们需要强转 for (int i = 0; i < 3; ++i) { fout.write((char*)&stu[i], sizeof(stu[i])); } delete[]stu; fout.close(); fstream fin("test.txt", ios::in | ios::binary); if (!fin) { cerr << "fin"; exit(1); } Student* stu2 = new Student[3]; //读文件 for (int i = 0; i < 3; ++i) { fin.read((char*)&stu2[i], sizeof(stu2[i])); } for (int i = 0; i < 3; ++i) { cout << stu2[i].m_name << " " << stu2[i].m_age << " " << stu2[i].m_score << endl; } delete[]stu2; fin.close(); return 0; }
输出信息
文件信息
文件数据定位
文件中有文件指针,我们每读取一个字节,这个指针就向后移动一个字节.
文件指针成员函数
gcount() 返回最后一次读取的字节数
tellg() 返回文件指针当前位置
seekg(指针位置) 将文件指针移动到指定位置
指针位置
ios::beg 默认值文件开始处
ios::cur 文件指针当前位置
ios::end 文件结尾处
seekg(偏移量,指针位置) 将文件指针移动偏移量的位置
tellp() 返回文件指针当前位置
seekp(指针位置) 将文件指针移动到指定位置
seekp(偏移量,指针位置) 将文件指针移动偏移量的位置
其中g是读取(读指针),p是写入(写指针)
EOF
也是成员函数,他一般是 -1 ,文本时ASCII码0到255,没有 -1 所以可直接判断.
Windows下文件结束符是CTRL+d,Linux下文件结束符是CTRL+d(这个是我百度到的答案,但是我记得好像是CTRL+c呢....)
C中有sprintf和sscanf,C++也有自己的对字符串读写.
istrstream strout(char* buf,int n)
ostrstream strin(char* buf,int n)
第一个是字符串地址,第二个是读取或写入多少个字符.
不过基本不会用这东西.
这篇关于C++文件读写的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-08CCPM如何缩短项目周期并降低风险?
- 2025-01-08Omnivore 替代品 Readeck 安装与使用教程
- 2025-01-07Cursor 收费太贵?3分钟教你接入超低价 DeepSeek-V3,代码质量逼近 Claude 3.5
- 2025-01-06PingCAP 连续两年入选 Gartner 云数据库管理系统魔力象限“荣誉提及”
- 2025-01-05Easysearch 可搜索快照功能,看这篇就够了
- 2025-01-04BOT+EPC模式在基础设施项目中的应用与优势
- 2025-01-03用LangChain构建会检索和搜索的智能聊天机器人指南
- 2025-01-03图像文字理解,OCR、大模型还是多模态模型?PalliGema2在QLoRA技术上的微调与应用
- 2025-01-03混合搜索:用LanceDB实现语义和关键词结合的搜索技术(应用于实际项目)
- 2025-01-03停止思考数据管道,开始构建数据平台:介绍Analytics Engineering Framework