C 的文件和流
1.打开文件
1.1 fstream类型
代码语言:javascript复制#include <fstream>
ofstream //文件写操作 内存写入存储设备
ifstream //文件读操作,存储设备读区到内存中
fstream //读写操作,对打开的文件可进行读写操作
1.2 open()的函数原型
代码语言:javascript复制void open ( const char * filename,
ios_base::openmode mode = ios_base::in | ios_base::out );
void open(const wchar_t *_Filename,
ios_base::openmode mode= ios_base::in | ios_base::out,
int prot = ios_base::_Openprot);
示例代码
代码语言:javascript复制#include <iostream>
#include <fstream> // 在C 使用文件与流必须包含fstream标准库
#include <iomanip>
using namespace std;
int main()
{
// 实例化输出流程对象,主要用于文件写入操作
ofstream inFile;
/*ios::trunc表示在打开文件前将文件清空,由于是写入,文件不存在则创建*/
inFile.open("inFile.txt", ios::trunc);
int i;
char a = 'a';
for (i = 1; i <= 26; i )//将26个数字及英文字母写入文件
{
// 写入文件内容
// 输出流实例 << 写入的内容 << endl;
inFile << setw(2) << i << "t" << a << "n";
a ;
}
//关闭输出流
inFile.close();
}
2.文本文件的读写
2.1 写文件示例
代码语言:javascript复制// writing on a text file
#include <fstream.h>
int main ()
{ // 通过带一个参数构造函数创建一个输出流对象
ofstream out(”out.txt”);
if (out.is_open())
{
out << ”This is a line.n”;
out << ”This is another line.n”;
out.close();
}
return 0;
}
结果
代码语言:javascript复制//结果: 在out.txt中写入:
This is a line.
This is another line
2.2 读文件示例
代码语言:javascript复制// reading a text file
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
int main ()
{
char buffer[256];
ifstream in("test.txt");
if (! in.is_open())
{
cout << ”Error opening file”;
exit (1);
}
while (!in.eof() ) //eof到文件末尾返回true
{
in.getline (buffer,100);
cout << buffer << endl;
}
return 0;
}
结果
代码语言:javascript复制//结果 在屏幕上输出
This is a line.
This is another line
2.3 逐字符读取和逐行读取
首先说说getline函数,需要头文件#include<string>
函数原型:istream& getline ( istream &is , string &str , char delim );
其中,istream &is 表示一个输入流,譬如cin;
string&str表示把从输入流读入的字符串存放在这个字符串中(可以自己随便命名,str什么的都可以);
char delim表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为’n’,也就是回车换行符
代码语言:javascript复制#include <iostream>
#include <fstream>
using namespace std;
void testByChar()
{
fstream testByCharFile;
char c;
testByCharFile.open("inFile.txt",ios::in);
while(!testByCharFile.eof())
{
testByCharFile>>c;
cout<<c;
}
testByCharFile.close();
}
void testByLine()
{
char buffer[256];
fstream outFile;
outFile.open("inFile.txt",ios::in);
cout<<"inFile.txt"<<"--- all file is as follows:---"<<endl;
while(!outFile.eof())
{
outFile.getline(buffer,256,'n');//getline(char *,int,char) 表现该行字符达到256个或碰到换行就结束
cout<<buffer<<endl;
}
outFile.close();
}
int main()
{
cout<<endl<<"逐个字符的读取文件:testByChar() "<<endl<<endl;
testByChar();
cout<<endl<<"将文件每行内容存储到字符串中,再输出字符串 :testByLine()"<<endl<<endl;
testByLine();
}
2.4 统计文本行数及读取某一行内容
代码语言:javascript复制//如何统计文本的行数及如何读取文件某一行内容:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int CountLines(char *filename)
{
ifstream in;
int n=0;
string tmp;
in.open(filename,ios::in);//ios::in 表示以只读的方式读取文件
if(in.fail())//文件打开失败:返回0
{
return 0;
}
else//文件存在
{
while(getline(in,tmp,'n'))
{
n ;
}
in.close();
return n;
}
}
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;
}
int main()
{
int line;
char filename[]="inFile.txt";
cout<<"该文件行数为:"<<CountLines(filename)<<endl;
cout<<"n请输入要读取的行数:"<<endl;
while(cin>>line)
{
cout<<"第"<<line<<"行的内容是 :"<<endl;
cout<<ReadLine(filename,line);
cout<<"nn请输入要读取的行数:"<<endl;
}
}
结果
代码语言:javascript复制/**********************************
程序运行情况如下:
该文件行数为:26
请输入要读取的行数:
-3
第-3行的内容是 :
Error 1: 行数错误,不能为0或负数。
请输入要读取的行数:
4
第4行的内容是 :
4 d
请输入要读取的行数:
8
第8行的内容是 :
8 h
请输入要读取的行数:
26
第26行的内容是 :
26 z
请输入要读取的行数:
33
第33行的内容是 :
Error 3: 行数超出文件长度。
请输入要读取的行数:
66
第66行的内容是 :
Error 3: 行数超出文件长度。
请输入要读取的行数:
^Z
**********************************/
2.5 读取数据到数组当中
代码语言:javascript复制//读取文件数据到临时数组
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int CountLines(char* filename)
{
ifstream ReadFile;
int n = 0;
string tmp;
ReadFile.open(filename, ios::in);//ios::in 表示以只读的方式读取文件
if (ReadFile.fail())//文件打开失败:返回0
{
return 0;
}
else//文件存在
{
while (getline(ReadFile, tmp, 'n'))
{
n ;
}
ReadFile.close();
return n;
}
}
int main()
{
ifstream file;
int LINES;
char filename[512] = "inFile.txt";
file.open(filename, ios::in);
if (file.fail())
{
cout << "文件不存在." << endl;
file.close();
}
else//文件存在
{
LINES = CountLines(filename);
int* tempInt = new int[LINES];
char* tempChar = new char[LINES];
int i = 0;
while (!file.eof()) //读取数据到数组
{
file >> tempInt[i];
file >> tempChar[i];
i ;
}
file.close(); //关闭文件
for (i = 0; i < LINES; i )//输出数组内容
{
cout << tempInt[i] << "t" << tempChar[i] << endl;
}
// 对象实例化使用new关键字,代表内存是动态分配的, 需要需要手动释放
delete[] tempInt;
delete[] tempChar;
}
}