c++文件操作

fstream提供了三个类,用来实现c++对文件的操作(文件的创建、读、写)

 

        ifstream -- 从已有的文件读入

       ofstream -- 向文件写内容

       fstream - 打开文件供读写

 

文件打开模式:

     ios::in             只读

     ios::out            只写

     ios::app            从文件末尾开始写,防止丢失文件中原来就有的内容

     ios::binary         二进制模式

     ios::nocreate       打开一个文件时,如果文件不存在,不创建文件

     ios::noreplace      打开一个文件时,如果文件不存在,创建该文件

     ios::trunc          打开一个文件,然后清空内容

     ios::ate            打开一个文件时,将位置移动到文件尾

 

 

 文件指针位置在c++中的用法:

     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个字节的位置

注意:移动的单位是字节,而不是行

 

 

常用的错误判断方法:

    good()   如果文件打开成功

    bad()   打开文件时发生错误

    eof()    到达文件尾

 

下面给出一个例子,读取hello.txt文件中的字符串,写入out.txt中:

#include  
#include  
#include  
#include  

using namespace std; 

int main() 
{ 

    ifstream myfile("G:\\C++ project\\Read\\hello.txt"); 
    ofstream outfile("G:\\C++ project\\Read\\out.txt", ios::app); 
    string temp; 
    if (!myfile.is_open()) 
    { 
        cout << "未成功打开文件" << endl; 
    } 
    while(getline(myfile,temp)) 
    { 
        outfile << temp; 
        outfile << endl;
    } 
    myfile.close(); 
    outfile.close();
    return 0; 
} 

 

其中getline的功能如下:

–从输入流中读入字符,存到string变量

–直到出现以下情况为止:

•读入了文件结束标志

•读到一个新行

•达到字符串的最大长度

–如果getline没有读入字符,将返回false,可用于判断文件是否结束

上述代码读取的是string类型的数据,那么对于int型数据该怎么办呢,其实道理差不多,下面举例说明:

#include
#include 
#include 
#include   //文件流库函数

using namespace std;

int cost[10][10];

int main()
{  
    int v, w, weight;
    ifstream infile;   //输入流
    ofstream outfile;   //输出流

    infile.open("G:\\C++ project\\Read\\data.txt", ios::in); 
    if(!infile.is_open ())
        cout << "Open file failure" << endl;
    while (!infile.eof())            // 若未到文件结束一直循环
    {
        infile >> v >> w >> weight;
        cost[v][w] = weight;
        cost[w][v] = weight;                
    }
    infile.close();   //关闭文件

    outfile.open("G:\\C++ project\\Read\\result.txt", ios::app);   //每次写都定位的文件结尾,不会丢失原来的内容,用out则会丢失原来的内容
    if(!outfile.is_open ())
        cout << "Open file failure" << endl;
    for (int i = 0; i != 10; ++i)
    {
        for (int j = 0; j != 10; ++j)
        {
            outfile << i << "\t" << j << "\t" << cost[i][j] << endl;  //在result.txt中写入结果
        }
    }
    outfile.close();
    return 0;
    while (1);
}

上述代码的功能是读取data.txt文件的数据,注意,此时要求data.txt文件中的数据是三个一行,每个数据用空格隔开,之所以这样做,是因为在许多项目中,比如某为的算法比赛中,根据图的数据构建图的邻接矩阵或者邻接表时,数据都是这样安排的,在上面的代码中v和w代表顶点标号,weight代表边的权值,上述代码的功能就是构建由data.txt文件描述的图的邻近矩阵。

data.txt文件的数据如下:

程序运行后,result.txt文件的内容如下:

你可能感兴趣的:(c/cpp)