首页 > 代码库 > C++学习笔记4--文件操作
C++学习笔记4--文件操作
【ios中的枚举常量】
skipws:跳过空白符读数。空格、制表符\t、回车符\r和换行符\n统称为空白符。默认为设置。
left:靠左对齐输出数据。
right:靠右对齐输出数据。
insternal:显示占满整个域宽,用填充字符在符号和数值之间填充。
dec:用十进制输出数据。
hex:用十六进制输出数据。
showbase:在数值前显示基数符,八进制基数符是0,十六进制基数符是0x。
showpoint:强制输出的浮点数中带有小数点和小数尾部的无效数字0.
uppercase:用大写输出数据。
showpos:在数值前显示符号。
scientific:用科学技术发显示浮点数。
fixed:用固定小数点位数显示浮点数。
例:字符相加
进行文件操作之前首先要打开文件。打开文件有两种方式。
(1)在创建文件流时利用构造函数打开文件,即在创建流时加入参数。语法结构如下:
<文件流类><文件流对象名>(<文件名>,<打开方式>)
其中文件流可以是fstream、ifstream和ofstream中的一种。文件名指的是磁盘文件的名称,包
括磁盘文件的路径名。打开方式在ios中定义,有输入方式、输出方式、追加方式等。
ios::in :用输入方式打开文件,文件只能读取,不能改写。
ios::out :以输出方式打开文件,文件只能改写,不能读取。
ios::app :以追加方式打开文件,打开后文件指针在文件尾部,可改写。
ios::ate :打开一存在的文件,文件指针指向文件的尾部,可读可写。
ios::binary :以二进制方式打开文件。
ios::trunc :打开文件进行写操作,如果文件已经存在,清除文件中的数据。
ios::nocreate :打开已经存在的文件,如果文件不存在,打开失败,不创建。
ios::noreplace :创建新文件,如果文件已经存在,打开失败,不覆盖。
参数可以结合运算符“|”使用,例如:
ios::in|ios::out :以读写方式打开,对文件可读可写。
ios::in|ios:binary :以二进制方式打开文件,进行读操作。
使用想读路径打开文件test.txt进行写操作:
ofstream outfile("test.txt",ios::out);
使用绝对路径打开文件test.txt进行写操作:
ofstream outfile("c:\\test.txt", ios::out);
(2)利用open函数打开磁盘文件。语法结构如下:
<文件流对象名>.open(<文件名>,<打开方式>);
文件流对象是一个已经定义了的文件流对象。
ifstream infile;
infile.open("test.txt",ios::out);
使用两种方式中的任意一种打开文件后,如果打开成功,文件流对象为非0值;如果打开失败,
则文件流对象为0.可以使用以下语句检测一个文件是否打开成功:
void open(const char* filename,int mode,int prot=filebuf::openprot)
prot决定文件的访问方式,取值说明如下:
0表示为普通文件。
1表示为只读文件。
2表示为隐含文件。
3表示为系统文件。
例:创建文件
【文件的读写】
(1)文件流类型:输入流、输出流、输入/输出流。
ifstream ifile; //声明一个输入流
ofstream ofile; //声明一个输出流
fstream iofile; //声明一个输入/输出流
(2)文件流成员函数。
ofstream和ifstream类有很多用于磁盘文件管理的函数。
attach:在一个打开的文件和流之间建立连接。
close:刷新未保存的数据后关闭文件。
flush:刷新流。
open:打开一个文件并把它与流连接。
put:把一个字节写入流中。
rdbuf:返回与流连接的filebuf对象。
seekp:设置流文件指针位置。
setmode:设置流为二进制或文本模式。
tellp:获取流文件指针位置。
write:把一组字节写入流中。
(3)fstream成员函数。
get(c) :从文件读取一个字符
getline(str,n,‘\n‘) :从文件读取字符存入字符串str中,知道读取n-1个字符或遇到‘\n‘时结
束
peek() :查找下一个字符,但不从文件中取出
put(c) :将一个字符写入文件
putback(c) :对输入流放回一个字符,但不保存
eof() :如果读取超过eof,返回true
ignore(n) :跳过n个字符,参数为空时,表示跳过下一个字符
例:使用ifstream和ofstream对象实现读写文件的功能。
例:使用fstream向文本文件写入数据。
例:读取文本文件
例:实现文件复制。
ios提供了一下成员函数来检测或设置流的状态。
int rdstate();
int eof();
int fail();
int bad();
int good();
int clear(int flag=0);
为提高程序的可靠性,应在程序中检测I/O流的操作是否正常。例如用fstream默认方式打开文
件时,如果文件不存在,fail函数就能检测到错误发生,然后通过rdstate方法获得文件状态。
fstream file("test.txt");
if(file.fail()) {
cout << file.rdstate() << endl;
}
文件的追加。
ofstream ofile("test.txt",ios::app);
if(!ofile.fail()) { ofile << "追加内容"; }
else cout << "can not open";
追加可以使用其他方法实现,例如先打开文件然后通过seekp方法将文件指针移到末尾,再向文
件中写入数据,整个过程和使用参数取值一样。使用seekp方法实现追加的代码如下:
文件结尾的判断:
如果文件指针指向文件末尾,get方法获取不到数据就返回-1,这可作为判断结束的标志。
同样功能使用eof方法也可以实现。
stream sp = ifile.tellg(); //sp为ifile指针当前位置
在指定位置读写文件。设置文件指针位置的函数:
seekg:位移字节数,相对位置用于输入文件中指针的移动。
seekp:位移字节数,相对位置用于输出文件中指针的移动。
tellg:用于查找输入文件中的文件指针位置。
tellp:用于查找输出文件中的文件指针位置。
ios::beg:文件头部。
ios::end:文件尾部。
ioe::cur:文件指针的当前位置。
例:输出文件指定位置的内容。
文件和流的关联和分离:一个流对象可以在不同时间表示不同文件。在构造一个流对象时,不用
将流和文件绑定。使用流对象的open成员函数动态与文件绑定,如果要关联其他文件就调
用close成员函数关闭当前文件与流的连接,再通过open成员函数建立与其他文件的连接。
删除文件,例:
skipws:跳过空白符读数。空格、制表符\t、回车符\r和换行符\n统称为空白符。默认为设置。
left:靠左对齐输出数据。
right:靠右对齐输出数据。
insternal:显示占满整个域宽,用填充字符在符号和数值之间填充。
dec:用十进制输出数据。
hex:用十六进制输出数据。
showbase:在数值前显示基数符,八进制基数符是0,十六进制基数符是0x。
showpoint:强制输出的浮点数中带有小数点和小数尾部的无效数字0.
uppercase:用大写输出数据。
showpos:在数值前显示符号。
scientific:用科学技术发显示浮点数。
fixed:用固定小数点位数显示浮点数。
例:字符相加
#include <iostream> #include <strstream> using namespace std; int main(int argc, char* argv[]) { char buf[] = "1002000"; int i , j; istrstream s1(buf); s1 >> i; istrstream s2(buf, 3); //读进3个字符 s2 >> j; cout << i + j <<endl; return 0; }
进行文件操作之前首先要打开文件。打开文件有两种方式。
(1)在创建文件流时利用构造函数打开文件,即在创建流时加入参数。语法结构如下:
<文件流类><文件流对象名>(<文件名>,<打开方式>)
其中文件流可以是fstream、ifstream和ofstream中的一种。文件名指的是磁盘文件的名称,包
括磁盘文件的路径名。打开方式在ios中定义,有输入方式、输出方式、追加方式等。
ios::in :用输入方式打开文件,文件只能读取,不能改写。
ios::out :以输出方式打开文件,文件只能改写,不能读取。
ios::app :以追加方式打开文件,打开后文件指针在文件尾部,可改写。
ios::ate :打开一存在的文件,文件指针指向文件的尾部,可读可写。
ios::binary :以二进制方式打开文件。
ios::trunc :打开文件进行写操作,如果文件已经存在,清除文件中的数据。
ios::nocreate :打开已经存在的文件,如果文件不存在,打开失败,不创建。
ios::noreplace :创建新文件,如果文件已经存在,打开失败,不覆盖。
参数可以结合运算符“|”使用,例如:
ios::in|ios::out :以读写方式打开,对文件可读可写。
ios::in|ios:binary :以二进制方式打开文件,进行读操作。
使用想读路径打开文件test.txt进行写操作:
ofstream outfile("test.txt",ios::out);
使用绝对路径打开文件test.txt进行写操作:
ofstream outfile("c:\\test.txt", ios::out);
(2)利用open函数打开磁盘文件。语法结构如下:
<文件流对象名>.open(<文件名>,<打开方式>);
文件流对象是一个已经定义了的文件流对象。
ifstream infile;
infile.open("test.txt",ios::out);
使用两种方式中的任意一种打开文件后,如果打开成功,文件流对象为非0值;如果打开失败,
则文件流对象为0.可以使用以下语句检测一个文件是否打开成功:
void open(const char* filename,int mode,int prot=filebuf::openprot)
prot决定文件的访问方式,取值说明如下:
0表示为普通文件。
1表示为只读文件。
2表示为隐含文件。
3表示为系统文件。
例:创建文件
#include <iostream> #include <fstream> using namespace std; int main(int argc, char* argv[]) { ofstream ofile; cout << "Create file1" << endl; ofile.open("test.txt"); if(!ofile.fail()) { ofile << "lasolmi" << endl; ofile.close(); cout << "Create file2" << endl; ofile.open("test2.txt"); if(!ofile.fail()) { ofile << "hello.world!" <<endl; ofile.close(); } } return 0; }
【文件的读写】
(1)文件流类型:输入流、输出流、输入/输出流。
ifstream ifile; //声明一个输入流
ofstream ofile; //声明一个输出流
fstream iofile; //声明一个输入/输出流
(2)文件流成员函数。
ofstream和ifstream类有很多用于磁盘文件管理的函数。
attach:在一个打开的文件和流之间建立连接。
close:刷新未保存的数据后关闭文件。
flush:刷新流。
open:打开一个文件并把它与流连接。
put:把一个字节写入流中。
rdbuf:返回与流连接的filebuf对象。
seekp:设置流文件指针位置。
setmode:设置流为二进制或文本模式。
tellp:获取流文件指针位置。
write:把一组字节写入流中。
(3)fstream成员函数。
get(c) :从文件读取一个字符
getline(str,n,‘\n‘) :从文件读取字符存入字符串str中,知道读取n-1个字符或遇到‘\n‘时结
束
peek() :查找下一个字符,但不从文件中取出
put(c) :将一个字符写入文件
putback(c) :对输入流放回一个字符,但不保存
eof() :如果读取超过eof,返回true
ignore(n) :跳过n个字符,参数为空时,表示跳过下一个字符
例:使用ifstream和ofstream对象实现读写文件的功能。
#include <iostream> #include <fstream> #include <cstring> using namespace std; int main(int argc, char* argv[]) { char buf[128]; ofstream ofile("test.txt"); for(int i=0;i<5;i++) { memset(buf,0,128); cin >> buf; ofile << buf; } ofile.close(); ifstream ifile("test.txt"); while(!ifile.eof()) { char ch; ifile.get(ch); if(!ifile.eof()) cout << ch; } cout << endl; ifile.close(); return 0; }
例:使用fstream向文本文件写入数据。
#include <iostream> #include <fstream> using namespace std; int main(int argc, char* argv[]) { fstream file("test.txt",ios::out); if(!file.fail()) { cout << "start write" << endl; file << "lasolmi" << endl; } else cout << "can not open" <<endl; file.close(); return 0; }
例:读取文本文件
#include <iostream> #include <fstream> using namespace std; int main(int argc, char* argv[]) { fstream file("test.txt",ios::in); if(!file.fail()) { while(!file.eof()) { char buf[128]; file.getline(buf,128); if(file.tellg() > 0) { cout <<buf; cout <<endl; } } } else cout << "can not open" <<endl; file.close(); return 0; }
例:实现文件复制。
ifstream infile; ofstream outfile; infile.open(infilename); if(!infile) {cout<<"fail open infile"<<endl;} outfile.open(outfilename); if(!outfile) {cout<<"fail open outfile"<<endl;} while(infile.get(c)) outfile << c; infile.close(); outfile.close();
ios提供了一下成员函数来检测或设置流的状态。
int rdstate();
int eof();
int fail();
int bad();
int good();
int clear(int flag=0);
为提高程序的可靠性,应在程序中检测I/O流的操作是否正常。例如用fstream默认方式打开文
件时,如果文件不存在,fail函数就能检测到错误发生,然后通过rdstate方法获得文件状态。
fstream file("test.txt");
if(file.fail()) {
cout << file.rdstate() << endl;
}
文件的追加。
ofstream ofile("test.txt",ios::app);
if(!ofile.fail()) { ofile << "追加内容"; }
else cout << "can not open";
追加可以使用其他方法实现,例如先打开文件然后通过seekp方法将文件指针移到末尾,再向文
件中写入数据,整个过程和使用参数取值一样。使用seekp方法实现追加的代码如下:
fstream iofile("test.dat",ios::in|ios::out|ios::binary); if(iofile) { iofile.seekp(0,ios::end); //为了写入移动 iofile << endl; iofile << "我是新加入的"; iofile.seekg(0); //为了写入移动 char data[100]; for(int i=0;!iofile.eof() && i<sizeof(data);i++) iofile.get(data[i]); cout << data; }
文件结尾的判断:
如果文件指针指向文件末尾,get方法获取不到数据就返回-1,这可作为判断结束的标志。
同样功能使用eof方法也可以实现。
stream sp = ifile.tellg(); //sp为ifile指针当前位置
在指定位置读写文件。设置文件指针位置的函数:
seekg:位移字节数,相对位置用于输入文件中指针的移动。
seekp:位移字节数,相对位置用于输出文件中指针的移动。
tellg:用于查找输入文件中的文件指针位置。
tellp:用于查找输出文件中的文件指针位置。
ios::beg:文件头部。
ios::end:文件尾部。
ioe::cur:文件指针的当前位置。
例:输出文件指定位置的内容。
#include <iostream> #include <fstream> using namespace std; int main(int argc,char* argv[]) { ifstream ifile; char cFileSelect[20]; cout << "input filename:"; cin >> cFileSelect; ifile.open(cFileSelect); if(!ifile) { cout << cFileSelect << " can not open" << endl; return 0; } ifile.seekg(0,ios::end); int maxpos = ifile.tellg(); int pos; cout << "Position:"; cin >> pos; if(pos > maxpos) cout << "is over file length" << endl; else { char ch; ifile.seekg(pos); ifile.get(ch); cout << ch <<endl; } ifile.close(); return 0; }
文件和流的关联和分离:一个流对象可以在不同时间表示不同文件。在构造一个流对象时,不用
将流和文件绑定。使用流对象的open成员函数动态与文件绑定,如果要关联其他文件就调
用close成员函数关闭当前文件与流的连接,再通过open成员函数建立与其他文件的连接。
删除文件,例:
#include <iostream> #include <fstream> using namespace std; int main(int argc,char* argv[]) { char file[50]; cout << "input file name:" << "\n"; cin >> file; if(!remove(file)) cout << "The file:" << file <<"已删除" << endl; else cout << "The file:" << file << "删除失败" <<endl; return 0; }
C++学习笔记4--文件操作
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。