C/C++教程

C++文件读写

本文主要是介绍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++文件读写的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!