2019年华科考了一道文件操作题,所以在这里补充一下相关知识。
文件操作头文件<fstream>,可读可写,定义好头文件好之后对文件的操作需要打开对应文件。
fstream f; f.open("abc.cpp",ios::in);
上面是打开文件的一般流程,第一句是定义文件指针,第二句的open第一个参数是文件名,第二个参数是控制文件的读写情况,此时成功即返回文件指针,f就与abc.cpp文件相对应了!
这里的第二个参数常用的有以下4个:
对文件操作重要的是输入输出,fstream由iostream引申而来,f可以代替cin和cout进行输入输出,即在我们正常的输入输出中,只要把cin或cout变成对应的文件指针就可以对该文件输入输出。
承接上面定义,下面代码表示从f指向文件中输入一行
string s; getline(f,s)
输入输出解决了,还有一个重点就是控制输入输出的位置
通俗而言,文件刚打开会有一个默认指向文件开头的指针,在这里对文件操作有文件内指针会自动移动到下一个位置,如果是上面对行操作会自动移动到下一行。
如果我们需要改变位置就用到seekg() 和seekp() 分布是改变输入和输出指针的位置,其有两个参数,意义如下。
ios::beg 文件头
ios::end 文件尾
ios::cur 当前位置
例子:
file.seekg(0,ios::beg); //让文件指针定位到文件开头 file.seekg(0,ios::end); //让文件指针定位到文件末尾 file.seekg(10,ios::cur); //让文件指针从当前位置向文件末方向移动10个字节 file.seekg(-10,ios::cur); //让文件指针从当前位置向文件开始方向移动10个字节 file.seekg(10,ios::beg); //让文件指针定位到离文件开头10个字节的位置
最后一步就是一些判断标志,文件是否打开,文件位置是否到了结尾等
Is_open( ) 判断文件是否处于打开的状态。如果是,返回true;如果不是,返回false
eof() 判断读文件是否到达文件末尾。如果是,返回true;如果不是,返回false
例题:
2019年华科机试第二题
将第一题的源代码保存为abc.c文件,并且要求abc.c文件中有相当数量的注释,包括//和/……/两种形式的注释
(1)读取abc文件的内容,将其显示在控制台上,并为每行代码增加一个符号。(10)
(2)使源代码中的//类型的注释内容不显示在控制台中。(10)
(3)使源代码中的/……/类型的注释内容不显示在控制台中。(10)
#include<fstream> #include<string> #include<iostream> using namespace std; int main(){ fstream f; string s,a; f.open("abc.cpp",ios::in);//打开文件,只读 while(getline(f,s)){ //一行行读入元素 for(int i=0;i<s.size();i++) { if(s[i]=='/'){ if(s[i+1]=='/'){ s.erase(s.begin()+i,s.end()); break;}//如果是行注释 else if(s[i+1]=='*') { //如果是/**/注释 a=s ; s.erase(s.begin()+i,s.end()); while(a[a.size()-1]!='/'){ //找到末尾 getline(f,a); } break; } } } cout<<s<<"!"<<endl; } f.close(); return 0; }
abc文件
对应结果: