C++进阶--文件和流

2023-08-09 22:20:40 浏览数 (1)

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;
    }
}
c++

0 人点赞