C++ 文件操作知识总结

目录

  1. 文件基本概念
  2. 文件I/O
  3. 文件顺序读写与随机文件读写
  4. 文件的打开与关闭
  5. 文本文件处理
  6. get(), getline(), put()函数
  7. 其他操作

一、文件基本概念

文件可以看作是一个连续的字符串集合,该字符串集合没有大小
字符串是以流的形式存在,文件也可以看作是一个流的集合,称为流式文件
文件可以看作将信息集合到一起存储的格式,通常存储在计算机的外部存储介质
使用文件有点:
1)文件可以使一个程序对不同的输入数据进行加工处理,并产生相应的输出结果
2)使用文件可以方便用户,提高上机效率
3)使用文件可以不受内存大小限制

二、文件I/O

C++标准库中,文件I/O操作有丰富的类,这些类都由一个抽象类作基类,然后这些抽象类派生出具体的实现类。
C++中对文件进行操作分为如下步骤:
1 建立文件流对象
2 打开或建立文件
3 进行读写操作
4 关闭文件
文件I/O操作的三个流类
1 fstream(输入输出文件流)
2 ifstream(输入文件流)
3 ofsream(输出文件流)
以上三个类都包含在fstream头文件中。程序对文件操作,必须包含该头文件。
ifstream对象如果重复使用,需注意使用前,先调用clear函数,否则会报错。

fstream案例

#include <iostream>
#include <string>
#include <fstream>
using namespace std;
//在当前工程目录test06下,建立com.txt
void fstreamEx()
{
	char buffer[256];
	fstream out;
	out.open("com.txt", ios::in);
	cout << "com.txt的内容如下:"<< endl;
	while(!out.eof())//eof end of file  判断是否到文件结尾
	{
		//getline(char*, int, char)表示该行字符达到256个或遇到换行符就结束
		out.getline(buffer, 256, '\n');
		cout << buffer << endl;
	}
	out.close();
	//cin.get()是用来读取回车键的,如果没这一行
	//输出的结果一闪就消失
	//cin.get();
}
void main()
{
	fstreamEx();
	system("pause");
}

ifstream案例

#include <iostream>
#include <string>
#include <fstream>
using namespace std;
//测试ifstream
int CountLines(char *filename)
{
	ifstream readFile;
	int n = 0;
	char line[512];
	string temp;
	//ios::in表示以只读方式读取文件
	readFile.open(filename, ios::in);
	//文件打开失败,返回true
	if(readFile.fail())
	{
		return 0;
	}
	else//文件存在
	{
		while(getline(readFile, temp))
		{
			n++;
		}
		return n;
	}
	readFile.close();
}

void ifstreamEx()
{
	cout << "com.txt的行数为: " << CountLines("com.txt") << endl;
}

void main()
{
	ifstreamEx();
	system("pause");
}

ofstream案例

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

void ofstreamEx()
{
	ofstream in;
	//ios::trunc表示在打开文件前将文件清空
	//由于写入,文件不存在则创建
	in.open("com.txt", ios::trunc);
	int i;
	char a = 'a';
	for(i = 1; i <= 26; i++)
	{
		if(i < 10)
		{
			in << "0" << i << "\t" << a << "\n";
			a++;
		}
		else
		{
			in << i << "\t" << a << "\n";
			a++;
		}
	}
	in.close();
}

void main()
{
	ofstreamEx();
	system("pause");
}

三、文件顺序读写与随机文件读写

顺序读写:
在C++文件中,每条记录是一个接着一个存储的,如果想查找一条记录,则必须从文件的开头逐一读取文件的记录,直到找到该条记录的位置。
随机文件读写:
随机文件每个记录都有一个记录号,在读写数据时,只要指定记录号,就可以对数据进行读写。

随机文件读写案例

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int CountLines(char *filename)
{
	ifstream readFile;
	int n = 0;
	string tmp;

	readFile.open(filename, ios::in);
	if(readFile.fail())
	{
		return 0;
	}
	else
	{
		while(getline(readFile, tmp))
		{
			n++;
		}
		return n;
	}

	readFile.close();
}

string ReadLine(char *filename, int line)
{
	int lines, i = 0;
	string temp;
	fstream file;
	file.open(filename, ios::in);
	lines = CountLines(filename);
	if(line <= 0)
	{
		return "error 1, 行数错误,不能为0或负数";
	}
	if(file.fail())
	{
		return "error 2, 文件不存在.";
	}
	if(line > lines)
	{
		return "error 3, 行数超出文件长度";
	}
	while(getline(file, temp) && i < line - 1)
	{
		i++;
	}
	file.close();
	return temp;
}

void test01()
{
	int l;
	char filename[256];
	cout << "请输入文件名: " << endl;
	cin >> filename;
	cout << "请输入要读取的行数: " << endl;
	cin >> l;
	cout << ReadLine(filename, l) << endl;
}

void main()
{
	test01();
	system("pause");
}

四、文件的打开与关闭

C++中,要进行文件的输入输出,必须创建一个流,把这个流与文件相关联,才能对文件进行操作,完成后要关闭文件。

文件的打开

1)fstream类中的open()成员函数
在fstream类中的open成员函数,用来打开文件。函数原型为:
void open(const char* filename, int mode, int access);
参数含义如下:
filename:要打开的文件名
mode:要打开文件的方式
access:打开文件的属性
打开文件的方式在类ios(是所有流式IO类的基类)中定义,常用值如下:
ios::app:以追加方式打开文件
ios::ate: 文件打开后定位到文件尾,ios:app就包含此属性
ios::binary:以二进制方式打开文件,默认的方式是文本方式
ios::in:文件以输入方式打开
ios::out:文件已输出方式打开
ios::nocreate:不建立文件,所以文件不存在时,打开失败
ios::noreplace:不覆盖文件,所以文件存在时打开失败
ios::trunc:如果文件存在,把文件长度设为0.
可以用“或”把以上属性连接起来,如ios::out | ios::binary
打开文件的属性取值:
0 普通文件,打开访问
1 只读文件
2 隐含文件
3 系统文件
默认打开方式:
如果没有指定打开方式参数,编译器会使用默认值
fstream 无默认值
ifstream std::ios::in
ofstream std::ios::out | std::ios::trunk

文件的关闭

1 当文件读写操作完成后,必须将文件关闭,以使文件重新变为可访问。
2 关闭文件需要调用成员函数close(),它负责将缓存中的数据排放出来并关闭文件。
3 关闭格式:void close();这个函数一旦被调用,原先的流对象就可以被用来打开其他文件,这个文件就可以重新被其他进程访问。
4 为防止流对象被销毁时还联系这打开的文件,析构函数将会自动调用关闭函数close.

五、文本文件处理

文本文件是以ASCII处理文件的,可以用字符处理软件来处理。文本文件的读写很简单,用插入运算符<<向文件输出,用析取运算符>>从文件输入

将变量写入文件

void writeFile()
{
	ofstream outfile;
	outfile.open("a.txt");//
	outfile << "锄禾日当午,汗滴禾下土";
	outfile.close();
}

将变量写入文件尾部

void writeAppendFile()
{
	ofstream outfile;
	outfile.open("a.txt", ios::out | ios::app);
	outfile << "谁知盘中餐,粒粒皆辛苦";
	outfile.close();	
}

从文本文件中读入变量

void readFile()
{
	ifstream infile;
	char value;
	infile.open("com.txt");
	if(infile.is_open())
	{
         //infile >> value
		while(infile.get(value))
		{
			cout << value;
		}
	}
	cout << endl;
	infile.close();
}

六、get(), getline(), put()函数

get()

get函数是ifstream类的成员函数,作用是读取该类的对象的一个字符并且将之作为调用函数的返回值。get函数会自动向后读取下一个字符,直到遇到文件结束符,则返回EOF作为文件的结束。

void testGet()
{
	ifstream infile;
	char value;
	infile.open("a.txt");
	if(infile.is_open())
	{
		while(infile.get(value))
		{
			cout << value;
		}
	}
	cout << endl;
	infile.close();
}

getline(str, n, ‘\n’)

从文件读取字符存入字符串str中,直到读取n-1个字符或遇到”\n”时结束

void testGetLine()
{
	char buffer[256];
	ifstream infile("com.txt");
	if(!infile.is_open())
	{
		cout << "error opening file";
		exit(1);
	}

	while(!infile.eof())
	{
		infile.getline(buffer, 100);
		cout << buffer << endl;
	}
}

getline(str, n, ‘\n’)

put函数用于输出流ofstream, 输出单个字符

void testPut()
{
	ofstream out("a.txt");//创建一个文件
	out.put('A');
	out.put('B');
	out.close();
}

七、其他操作

get(c)从文件中读取一个字符,如果返回-1,则表示读取到文件末尾。
eof() 如果到文件末尾,返回true,否则返回false。
remove(const char* name),删除文件,成功返回true,否则返回false
peek():查找下一个字符,但不从文件中取出

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值