精华内容
下载资源
问答
  • C++写文件时覆盖与否的问题

    万次阅读 2015-06-11 19:48:50
    c++写文件不覆盖原内容
    ofstream out("/path/to/file");
    out<<"write to file"<<endl;
    out.close();

    使用上述方式,若文件不存在,自动创建新文件并写入“write to file”;若文件存在,会覆盖掉原文件的内容,写入“write to file”。

    如果希望每次都写入文件末尾,而不覆盖原文件,可采用以下方式:

    ofstream out(perf_count_path,ios::app);
    out<<"write to file"<<endl;
    out.close();
    使用ios::app实现追加写文件,不要忘记#include <iostream.h>


    展开全文
  • C++读写文件保存至容器list中

    千次阅读 2015-11-05 21:09:28
    C++读写文件及容器list基本操作  大家在开始入门C/C++时,都要练习个学生管理系统啥的,主要都为了进一步掌握所学知识,并能使用这些知识。其中这个小项目的重难点就在数据的操作了,其中如何将数据保存到文件中及...

    C++读写文件及容器list基本操作

          大家在开始入门C/C++时,都要练习个学生管理系统啥的,主要都为了进一步掌握所学知识,并能使用这些知识。其中这个小项目的重难点就在数据的操作了,其中如何将数据保存到文件中及如何将文件中的内容读出并存放到list中。

          读写文件基本思路是,打开文件,然后进行读写操作,在关闭文件。其中读写文件我是选择了fscanf()和fprintf(),

    使用这一对函数,我个人感觉,写入的文件可视性较强,在这里比二进制读写fwrite()和fread()好。

    参考代码如下:

    1.读出文件存放list中

          typedef list<Student>Stu;

           bool DataOper::ReadFileToList(Stu &stu)
           {
     FILE *fp = NULL;

      //1.fopen
      if( (fp = fopen("student.txt","r")) == NULL)
      {
    cout<<"open File Error"<<endl;
    return false;
      }

      //2.read File

      while(1)
      {
    fscanf(fp,"%d %s %d %c %d %d %d %d %d",&student.Id,student.Name,&student.passwd,&student.Sex,&student.Age,
    &student.Class,&student.Math,&student.English,&student.Chinese);

    if(feof(fp))
    {
    break;
    }
    stu.push_back(student);
      }

      //3.fclose
      fclose(fp);
      return true;
        }


    2.将list数据写入文件

    bool DataOper::WriteFile(Stu &stu)
    {
    FILE *fp = NULL;
    Stu::iterator iStu = stu.begin();
    //1.fopen
    if( (fp = fopen("student.txt","w")) == NULL)
    {
    cout<<"open File Error"<<endl;
    return false;
    }


    //2.write File
    while(iStu != stu.end())
    {


    fprintf(fp,"%d %s %d %c %d %d %d %d %d\n",iStu->Id,iStu->Name,iStu->passwd,iStu->Sex,iStu->Age,iStu->Class,
    iStu->Math,iStu->English,iStu->Chinese);


    iStu++;
    }
    //3.fclose
    fclose(fp);
    return true;
    }

    展开全文
  • C++读写文件操作

    万次阅读 2012-07-24 16:14:07
    原文来自:...   第一篇:C++ 文件操作 来源:http://www.javaeye.com/topic/383903 读 《C++ Primer Plus》第17章4-7节 在线文档:http://www.cplusplus.com/reference   一 头 文

    原文来自:http://blog.csdn.net/study16/article/details/5879428

     

    第一篇:C++ 文件操作

    来源:http://www.javaeye.com/topic/383903

    读 《C++ Primer Plus》第174-7

    在线文档:http://www.cplusplus.com/reference

     

    一     头 文件关系:

    C++在头文件fstream(fstream.h)中定义了ifstream类和oftream类,以及用于I/O同步的fstream。这些类都是从头文件iostream中的类派生而来,iostream的基类是istream,ostream。对于大多数实现来说,包含fstream则自动包含iostream文件。ofstream的基类是ostream,iftream类的基类是istream。文件流类从ios_base类中继承了一个流状态成员以及报告流状态的 方法。

    二     创 建读写流对象的方法:

    1  构造函数

                       1.              ifstream fin;      fin.open(“jar.dat”);     或者 ifstram fin(“jar.dat”);

                                ofstream同理

                                使用方法可同cin,cout.cin>>name;cout<<name;

    2.      文件模式的使用 方法:

             ifstraem fin(“temp.txt”,mode);

             ofstream fout;

    fout.open(“temp.txt”,mode);

    2)   open函数

             在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是:

      void yWXz(const char* filename,int mode,int access); 
    参数说明:   
      
    filename:  要打开的文件名 
      
    mode:    要打开文件的方式 
      
    access:   打开文件的属性 
      打开文件的方式在类
    ios(是所有流式I/O类的基类)中定义,常用的值如下:     

    常量

    含义

    常量

    含义

    ios_base::in

    打开文件,以便 读取

    ios_base::app

    追加到文件尾

            out

                  写 入

            trun

    文件存在,则截 短文件

            ate

            ,并移到文件尾

            binary

    二进制文件

    ios::nocreate: 不建立文件,所以文件不存在时打开 失败 

    ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败

    ios::trunc:  如果文件存在,把文件长度设为0

     

    打开文件的属性取值是:   

      0:普通文件,打开访问

      1:只读文件

      2:隐含文件

      4:系统文件

      可以用或者“+”把以上属性连接起来 ,如31|2就 是以只读和隐含属性打开文件。   

      例如:以二进制输入方式打开文件c:/config.sys   

        fstream file1;

        file1.open("c://config.sys",ios::binary|ios::in,0);   

        如果open函数只有文件名一个参数,则是以读/写普通文件打开,即:   

        file1.open("c://config.sys");<=>file1.open("c://config.sys",ios::in|ios::out,0);   

        另外,fstream还有和open()一样的构造函数,对于上例,在定义的时侯就可以 打开文件了:   

        fstream file1("c://config.sys");   

        特别提出的是,fstream有两个子类:ifstream(input file stream)ofstream(outpu file stream)ifstream默认以输入方式打开文件,而ofstream默认以输出方式打开文件。   

        ifstream file2("c://pdos.def");//以输入方式打开文件

        ofstream file3("c://x.123");//以输出方式打开 文件

    三     检 查文件是否打开的方法:

    a)      if(fin.fail());

    b)      if(!fin.good());

    c)      if(!fin)        //根据fin.good()来设置自己的bool

    d)      is_open() //能够检测到一不合适的文本模式打开文件时失败的错误和上述good()测到的各种错误

             fin.good();//正常读取文件时返回true

             fin.fail();/在文件到达结尾或者出现其他输入错误如内存不足时返回true

             fin.eof();//当文件到达结尾的返回true

             fin.bad();//出现无法识别的故障(如硬盘故障)时返回true

    四     使 用命令行参数的方法:

              int main(int argc,char* argv[]){…}    第一个参数为命令和参数个数的和,第二个参数为参数数组

              fin.clear()         将文件与ifstream对象关联起来时,自动重置状态。不一定要 求,但是无害。

    五     文 件模式常量:

    六     C++C的文件打 开模式

    C++模式

    C模式

    含义

    ios_base::in

    “r”

    打开一读取

    ios_base::out

    “w”

    等价于ios_base::out|ios_base::trunk(有时可以省略)

    out|trunc

    “w”

    打开一些如文 件,如果存在,则截取文件

    out|app

    “a”

    打开以写入,只 追加

    in|out

    “r+”

    打开以写入,在 文件读取的位置写入

    in|out|trunc

    “w+”

    打开以读写,如 果存在,则首先截取文件

    out|binary

    cmodeb

    C++mode和二进制模式打开,例如ios_base::in|ios_base::binary成为“rb”

    out|ate

    “cmode”

    以指定的模式打 开,并已到文件尾。C则需要使用 独立的函数调用。例如,ios_base::in|ios_base::ate则被转换为“r”C函数调用fseek(file,0,SEEK_END);

    对于app模式,只能追加,但是不能修改原来已经存在的数据, 要是其能修改,则需要与out模 式组合,即app|out。对于 已经处理到末尾的文件,eof位 将被被设置为1,因此,如果想对 文件再作修改,则需要调用函数fout.clear()终止流状态,否则禁止对文件作进一步读写操作。

    七     文 件读写:

    1)   操纵符 功能 输入/输出

    dec 格式化为十进制数值数据 输入和输出

    endl 输出一个换行符并刷新此流 输出

    ends 输出一个空字符 输出

    hex 格式化为十六进制数值数据 输入和输

    出 oct 格式化为八进制数值数据 输入和输出

    setpxecision(int p) 设置浮点数的精度位数 输出

     

             2)   基本 方法

             ①put()

        put()函数向流写入一个字符,其原型是ofstream &put(char ch),使用也比较简单,如file1.put('c');就是向流写一个字符'c'。   

       ②get()

        get()函数比较灵活,有3种常用的重载形式:   

        一种就 是和put()对应的形式:ifstream &get(char &ch);功能是从流中读取一个字符,结果保存在引用ch中,如果到文件尾,返回空字符。如file2.get(x);表示从文件中读取一个字符,并把读取的字符保存在x中。   

        另一种重载形式的原型是: int get();这种形式是从流中返回一个字符,如果到达文件尾,返回EOF,如x=file2.get();和上例功能是一样的。   

        还有一种形式的原型是:ifstream &get(char *buf,int num,char delim='/n');这种形式把字符读入由 buf指向的数组,直到读入了 num 个字符或遇到了由 delim 指定的字符,如果没使用 delim 这个参数,将使用缺省值换行符'/n'。例如:   

        file2.get(str1,127,'A');//从文件中读取字符到字符串str1,当遇到字符'A'或读取了127个 字符时终止。  

      读写数据 块(read, write

        要读写 二进制数据块,使用成员函数read()write()成员函数,它们原型如下:

        read(unsigned char *buf,int num);

        write(const unsigned char *buf,int num);

          read()从文件中读取 num 个字符到 buf 指向的缓存中,如果在还未读入 num 个字符时就到了文件尾,可以用成员函数 int gcount();来取得实际读取的字符数;而 write() buf 指向的缓存写 num 个字符到文件中,值得注意的是缓存的类型是 unsigned char *,有时可能需要类型转 换。   

      例:

          out.write(str1,strlen(str1));//把字符串str1全部写到yyy.yyy

          in.read((unsigned char*)n,sizeof(n));//xxx.xxx中读取指定个整数,注意类型转换

    八     随 即读取文件的函数

             和C的文件操作方式不同的是,C++ I/O系统管理两个与一个文件相联系的指针。一个是 读指针,它说明输入操作在文件中的位置;另一个是写指针,它下次写操作的位置。每次执行输入或输出时,相应的指针自动变化。所以,C++的文件定位分为读位置和写位置的定位,对应的成员函数是 seekg()和 seekp()seekg()是设置读位置,seekp是设置写位置。它们最通用的形式如下:   

          istream &seekg(streamoff offset,seek_dir origin);

       ostream &seekp(streamoff offset,seek_dir origin);

        streamoff定义于 iostream.h 中,定义有偏移量 offset 所能取得的最大值,seek_dir 表示移动的基准位置,是一个有以下值的 枚举:   

      ios::beg:  文件开头

      ios::cur:  文件当前位置

      ios::end:  文件结尾

        这两个 函数一般用于二进制文件,因为文本文件会因为系统对字符的解释而可能与预想的值不同。

      例:

           file1.seekg(1234,ios::cur);//把文件的读指针从当前位置向后移1234个字节

           file2.seekp(1234,ios::beg);//把文件的写指针从文件开头向后移1234个字

    代码展示

    1)   覆盖操作:(tellpseekp

    outfile.write ("This is an apple",16);

    pos=outfile.tellp();

    outfile.seekp (pos-7);

    outfile.write (" sam",4);

    输出:This is a sample

    2)   读取整个文件到缓冲(seekg,tellg)

      int length;

      char * buffer;

      ifstream is;

      is.open ("test.txt", ios::binary );

      // get length of file:

      is.seekg (0, ios::end);

      length = is.tellg();

      is.seekg (0, ios::beg);

      // allocate memory:

      buffer = new char [length];

      is.read (buffer,length);

      is.close();

     

      cout.write (buffer,length);

     

      delete[] buffer;

    九     文 件操作结构体

             struct   DATA {  

           int   n;  

           char   a;  

      };

      ostream&   operator   <<(ostream&   os,   DATA&   data) {   
             os<<data.a;   
             os<<data.n;   
             return   os;   
      }   
      istream&   operator   >>(istream&   os,   DATA&   data) {   
             os>>data.a;  

             os>>data.n;  

             return   os;  

      }

    十     使 用临时文件(cstdio(stdio.h))

    tmpname(pasName);生成生成与当前目录不重名的字符串存于pasName中,pasName的长度最多为L_tmpnam,最多生成TMP_NAM个不同的文件名。
    ===========================
    2C/C++读写文件小结 1-4全集
    http://rf0007.spaces.live.com/blog/cns!DBC9143ACED2EB3A!117.entry

    因为工作需要,最近到处摘抄C/C++关于读写 文件的例子,这里留个小结,以备后用。
    读文件的流程是大致是如此的:
    建立一个操作文件的指针 
    *fd => 用某种方式(读//读写/追加等等)打开文件 => 对文件做相应的操作。
    示例文件名为
    readtxt.txt,同程序置于相同目录下。 文件内容为:
    hello,world
    my name is rf0007

     纯C的读文本文件
    定 义一个文件指针
    FILE *fd;
    fopen打开一个文本文件,fopen的第一个参数为文件路和文件名,第二个参数定义的是打开文件 的方式,这些参数实在是记不住,具体的如下:

    参 数

    全写

    意义

    r

    read

    w

    write

    a

    append

    追加

    t

    text

    文本文件,可省略

    b

    binary

    二 进制文件

    rt

    只读,文本文件

    wt

    只写或建立,文本文件

    at

    在文件末尾 追加,文本文件

    rb

    只读,二进制文件

    wb

    只写或建立,二进制文件

    ab

    在文件末尾 追加,二进制文件

    rt+

    可读可写,文本文件

    wt+

    可读可写或建立,文本文件

    at+

    可 读可写,在文件的末尾追加,文本文件

    rb+

    可读可写,二进制文件

    wb+

    可读可写或建立,二进制文件

    ab+

    可读可写,在文件的末尾追加,二进制文件

    fd = fopen("txtfile.txt","r");
    执行完
    fopen后,需要判断一下,此文件是否确实被打开了。

    if(NULL == fd)printf("
    文件未被打开");
    接下来就可以进行文件的操作了。
    读文件的函数有好几 个,
    fread,fscanf,fgets。它们之间是有区别的:
    fread
    是以块的方式来读取数据,按照指定的长度和指定的次数来读,读完后的 数据是按照地址的方式来存储的,所以,比较适合用它来读二进制数,因为程序员比较清楚的知道自己要读多少的数据。
    fgets
    是以串的方式来读取数 据,从数据文件中读取不超过N-1个字符的数,读入的数据在最后一个字符后会加上一个截止符'/n',如果中间出现了回车,就会截止了。所以可以用 fgets来读入一行的文本数据,应该是相当好用的。
    fscanf
    fgets类似,不过它是按照格式来读的,跟scanf一样。比如说,指定一 个%d,那么它就读入一个整型的值;如果指定一个%s,那么它遇到一个空格也会停止的。
    以下是一个实际的代码,用三种方式来完成文件的读取。
    #include <stdio.h> 
    int main()
    {
        FILE *fd;
        char buf[64];
        fd = fopen("txtfile.txt","rb");
        if(NULL == fd)
        {
          printf("read file error!");
          return 0;       
        }
        printf("read file success!/n");
        while(!feof(fd))
        {
            /*method 1
          fgets(buf,64,fd);
          printf("%s/n",buf);
          */
          /*method 2
          fread(buf,64,1,fd);
          printf("the %dth time: %s /n ",count,buf);
          */
          fscanf(fd,"%s",buf);
          printf("%s/n",buf);
        }   
        fclose(fd);
        return 1;
    }

    C的写文本文件
    与 上文中描述的读文件相似,写文件也有这么几个函数
    fputs,fwrite,fprintf,其中fputsfgets对应,fwritefread 对应,fscanffprintf对应。同样的,它们之间也是有区别的。fputs多用于写入成行的文本文件,fwrite用于写入二进制文 件,fprintf用于写入格式化的数据。
    以下为示例程序源代码:

    #include <stdio.h>
    int main()
    {
        FILE *fd;
        char buf[64];
        char *str1 = "hello,world/n";
        char *str2 = "my name is rf0007";
        fd = fopen("txtfile.txt","wt");
        if(NULL == fd)
        {
            printf("open file error!/n");
            return 0;    
        }
        /*method 1
        fputs(str1, fd);
        fputs(str2, fd);
        */

        /*method 2
        fwrite(str1, strlen(str1), 1, fd);
        fwrite(str2, strlen(str2), 1, fd);
        */

        fprintf(fd, "%s", str1);
        fprintf(fd, "%s", str2);
        
        fclose(fd);
        return 1;    
    }

    C读 写二进制文件
    读写二进制文件与读写文本文件本身没有太大的区别,只不过能使用的函数有区别而已。在上文中提到使用的 
    fread,fwrite,fgetc,fputc都可以用来操作二进制文件。以下的例子是将一串数据写入二进制文件,然后再将其还原出来。
    #include <stdio.h> 
    int main()
    {
        FILE *fd;
        int iVal;
        float fVal;
        char *cVal = "hello,world";
        int count;
        //write file
        fd = fopen("file1.dat","wb");
        if(NULL == fd)
        {
            printf("1.open file error!/n");
            return 0;
        }
        fVal = 1.1;
        int i;
        for(i=0; i<5; i++)
        {
            iVal = 100+i;
            printf("iVal(%d)=%d /n",i,iVal);
            fwrite(&iVal, sizeof(int), 1, fd);
            fVal = 1.1+i;
            fwrite(&fVal, sizeof(float), 1, fd);
            printf("fVal(%d)=%f /n",i,fVal);            
        }
        fclose(fd);
        //read file
        fd = fopen("file1.dat","rb");
        if(NULL == fd)
        {
            printf("2.open file error!/n");
            return 0;
        }
        printf("read file ==========/n");
        i = 0;
        while(!feof(fd))
        {
            fread(&iVal, sizeof(int), 1, fd);
            printf("iVal(%d)=%d /n",i,iVal);
            fread(&fVal, sizeof(float), 1, fd);
            printf("fVal(%d)=%f /n",i,fVal);
            i++;    
        }
        fclose(fd);
        return 1;    
    }

    读 写文件操作常用的几个函数

    rewind(fd)

    将文件的指针移动到文件头,同时清除流错误和eof标识

    fseek()

    将文件指 针设置到新的位置,用于随机文件访问比较方便

    fsetpos()

     

    fgetpos()

     

    ftell()

    得到当前的 文件的位置


    C++
    文件操作(STD)
    需要包含 的头件
    :
    #include <fstream>
    using namespace std;
    有三种文件流 
    ofstream,ifstream,fstream,定义基本上一致
    fstream fs;
    fs.open(filename,mode);
    mode 
    有以下几种模式:

    ios::out

    输出数据覆盖现有文件

    ios::app

    追加

    ios::ate

    打 开文件并移动文件指针至末尾

    ios::in

    输入

    ios::trunc

    输出文件中现有内容

    ios::binary

    二进制方式打开

    C语言读写文件相似,fs.read()fs.write()的方法用于读写二进制文件比较方便,如果用于读写文本文件可以用别的办法。以下 示例是用于读写文本文件。
    #include <fstream>
    #include <iostream>

    using namespace std;
    int main()
    {
        fstream fs;
        char str[64];
        char str1[] = "hello,world/n";
        char str2[] = "my name is rf0007";
        //write file
        fs.open("txtfile2.txt", ios::out);
        if(NULL == fs)
        {
          cout << "1.open file error!" << endl;
          return 0;        
        }
        /*method 1
        fs << "hello,world" << endl;
        fs << "my name is rf0007" << endl;
        */
        fs.write(str1, strlen(str1));
        fs.write(str2, strlen(str2));
        fs.close();
        //read file
        fs.open("txtfile2.txt", ios::out|ios::in);
        if(NULL == fs)
        {
            cout << "2.open file error!" << endl;
          return 0;      
        }
        /*method 1
        while(!fs.eof())
        {
            fs.getline(str, 64);
            cout << str << endl;
        }
        */
        while(!fs.eof())
        {
            fs.read(str, 32);
            cout << str << endl;    
        }
        fs.close();
        return 1;   
    }
    在文件检索函数
    ofstream::seekp(位置,起始点)ifstream::seekg(位置起始点)中,第一个参数为相对于起始点的偏移量,第二个参数的选项为:

    展开全文
  • c++读写文件设定读和的位置

    万次阅读 2015-11-04 15:32:07
    文件定位  和C的文件操作方式不同的是,C++ I/O系统管理两个与一个...所以,C++文件定位分为读位置和位置的定位,对应的成员函数是 seekg()和 seekp()  seekg()是设置读位置,  seekp是设置位置。
    文件定位
      和C的文件操作方式不同的是,C++ I/O系统管理两个与一个文件相联系的指针。一个是读指针,它说明输入操作在文件中的位置;另一个是写指针,它下次写操作的位置。每次执行输入或输出时,相应的指针自动变化。所以,C++的文件定位分为读位置和写位置的定位,对应的成员函数是 seekg()和 seekp()
      seekg()是设置读位置,
      seekp是设置写位置。
      它们最通用的形式如下: 
      istream &seekg(streamoff offset,seek_dir origin); 
      ostream &seekp(streamoff offset,seek_dir origin); 
      streamoff定义于 iostream.h 中,定义有偏移量 offset 所能取得的最大值,seek_dir 表示移动的基准位置,是一个有以下值的枚举: 
      ios::beg: 文件开头 
      ios::cur: 文件当前位置 
      ios::end: 文件结尾 
      这两个函数一般用于二进制文件,因为文本文件会因为系统对字符的解释而可能与预想的值不同。 
      例: 
      file1.seekg(1234,ios::cur);//把文件的读指针从当前位置向后移1234个字节 
      file2.seekp(1234,ios::beg);//把文件的写指针从文件开头向后移1234个字节 
      如果vc编程的话最好使用CFile类等更加方便于文件操作</CA> 
    以下是关于文件流的详细介绍
    在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符: 
      1、插入器(<<) 
      向流输出数据。比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout<<"Write Stdout"<<'n';就表示把字符串"Write Stdout"和换行字符('n')输出到标准输出流。 
      2、析取器(>>) 
      从流中输入数据。比如说系统有一个默认的标准输入流(cin),一般情况下就是指的键盘,所以,cin>>x;就表示从标准输入流中读取一个指定类型(即变量x的类型)的数据。 
      在C++中,对文件的操作是通过stream的子类fstream(file stream)来实现的,所以,要用这种方式操作文件,就必须加入头文件fstream.h。下面就把此类的文件操作过程一一道来。 
      一、打开文件 
      在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是: 
      void open(const char* filename,int mode,int access); 
      参数: 
      filename: 要打开的文件名 
      mode: 要打开文件的方式 
      access: 打开文件的属性 
      打开文件的方式在类ios(是所有流式I/O类的基类)中定义,常用的值如下: 
      ios::app: 以追加的方式打开文件 
      ios::ate: 文件打开后定位到文件尾,ios:app就包含有此属性 
      ios::binary: 以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文 
      ios::in: 文件以输入方式打开 
      ios::out: 文件以输出方式打开 
      ios::nocreate: 不建立文件,所以文件不存在时打开失败 
      ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败 
      ios::trunc: 如果文件存在,把文件长度设为0 
      可以用“或”把以上属性连接起来,如ios::out|ios::binary 
      // 注:现在C++标准库不支持nocreate和noreplace,以前的旧版本可以用.
      打开文件的属性取值是: 
      0:普通文件,打开访问 
      1:只读文件 
      2:隐含文件 
      4:系统文件 
      可以用“或”或者“+”把以上属性连接起来 ,如3或1|2就是以只读和隐含属性打开文件。 
      例如:以二进制输入方式打开文件c:config.sys 
      fstream file1; 
      file1.open("c:config.sys",ios::binary|ios::in,0); 
      如果open函数只有文件名一个参数,则是以读/写普通文件打开,即: 
      file1.open("c:config.sys");<=>file1.open("c:config.sys",ios::in|ios::out,0); 
      另外,fstream还有和open()一样的构造函数,对于上例,在定义的时候就可以打开文件了: 
      fstream file1("c:config.sys"); 
      特别提出的是,fstream有两个子类:ifstream(input file stream)和ofstream(outpu file stream),ifstream默认以输入方式打开文件,而ofstream默认以输出方式打开文件。 
      ifstream file2("c:pdos.def");//以输入方式打开文件 
      ofstream file3("c:x.123");//以输出方式打开文件 
      所以,在实际应用中,根据需要的不同,选择不同的类来定义:如果想以输入方式打开,就用ifstream来定义;如果想以输出方式打开,就用ofstream来定义;如果想以输入/输出方式来打开,就用fstream来定义。 
      二、关闭文件 
      打开的文件使用完成后一定要关闭,fstream提供了成员函数close()来完成此操作,如:file1.close();就把file1相连的文件关闭。 
      三、读写文件 
      读写文件分为文本文件和二进制文件的读取,对于文本文件的读取比较简单,用插入器和析取器就可以了;而对于二进制的读取就要复杂些,下要就详细的介绍这两种方式 
      1、文本文件的读写 
      文本文件的读写很简单:用插入器(<<)向文件输出;用析取器(>>)从文件输入。假设file1是以输入方式打开,file2以输出打开。示例如下: 
      file2<<"I Love You";//向文件写入字符串"I Love You" 
      int i; 
      file1>>i;//从文件输入一个整数值。 
      这种方式还有一种简单的格式化能力,比如可以指定输出为16进制等等,具体的格式有以下一些 
      操纵符 功能 输入/输出 
      dec 格式化为十进制数值数据 输入和输出 
      endl 输出一个换行符并刷新此流 输出 
      ends 输出一个空字符 输出 
      hex 格式化为十六进制数值数据 输入和输出 
      oct 格式化为八进制数值数据 输入和输出 
      setpxecision(int p) 设置浮点数的精度位数 输出 
      比如要把123当作十六进制输出:file1<<hex<<123;要把3.1415926以5位精度输出:file1<<setpxecision(5)<<3.1415926。 
      2、二进制文件的读写 
      ①put() 
      put()函数向流写入一个字符,其原型是ofstream &put(char ch),使用也比较简单,如file1.put('c');就是向流写一个字符'c'。 
      ②get() 
      get()函数比较灵活,有3种常用的重载形式: 
      一种就是和put()对应的形式:ifstream &get(char &ch);功能是从流中读取一个字符,结果保存在引用ch中,如果到文件尾,返回空字符。如file2.get(x);表示从文件中读取一个字符,并把读取的字符保存在x中。 
      另一种重载形式的原型是: int get();这种形式是从流中返回一个字符,如果到达文件尾,返回EOF,如x=file2.get();和上例功能是一样的。 
      还有一种形式的原型是:ifstream &get(char *buf,int num,char delim='n');这种形式把字符读入由 buf 指向的数组,直到读入了 num 个字符或遇到了由 delim 指定的字符,如果没使用 delim 这个参数,将使用缺省值换行符'n'。例如: 
      file2.get(str1,127,'A');//从文件中读取字符到字符串str1,当遇到字符'A'或读取了127个字符时终止。 
      ③读写数据块 
      要读写二进制数据块,使用成员函数read()和write()成员函数,它们原型如下: 
      read(unsigned char *buf,int num); 
      write(const unsigned char *buf,int num); 
      read()从文件中读取 num 个字符到 buf 指向的缓存中,如果在还未读入 num 个字符时就到了文件尾,可以用成员函数 int gcount();来取得实际读取的字符数;而 write() 从buf 指向的缓存写 num 个字符到文件中,值得注意的是缓存的类型是 unsigned char *,有时可能需要类型转换。 
      例: 
      unsigned char str1[]="I Love You"; 
      int n[5]; 
      ifstream in("xxx.xxx"); 
      ofstream out("yyy.yyy"); 
      out.write(str1,strlen(str1));//把字符串str1全部写到yyy.yyy中 
      in.read((unsigned char*)n,sizeof(n));//从xxx.xxx中读取指定个整数,注意类型转换 
      in.close();out.close(); 
      四、检测EOF 
      成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0。原型是int eof(); 
      例: if(in.eof())ShowMessage("已经到达文件尾!"); 
      五、文件定位 
      和C的文件操作方式不同的是,C++ I/O系统管理两个与一个文件相联系的指针。一个是读指针,它说明输入操作在文件中的位置;另一个是写指针,它下次写操作的位置。每次执行输入或输出时,相应的指针自动变化。所以,C++的文件定位分为读位置和写位置的定位,对应的成员函数是 seekg()和 seekp(),seekg()是设置读位置,seekp是设置写位置。它们最通用的形式如下: 
      istream &seekg(streamoff offset,seek_dir origin); 
      ostream &seekp(streamoff offset,seek_dir origin); 
      streamoff定义于 iostream.h 中,定义有偏移量 offset 所能取得的最大值,seek_dir 表示移动的基准位置,是一个有以下值的枚举: 
      ios::beg: 文件开头 
      ios::cur: 文件当前位置 
      ios::end: 文件结尾 
      这两个函数一般用于二进制文件,因为文本文件会因为系统对字符的解释而可能与预想的值不同。 
      例: 
      file1.seekg(1234,ios::cur);//把文件的读指针从当前位置向后移1234个字节 
      file2.seekp(1234,ios::beg);//把文件的写指针从文件开头向后移1234个字节 
      如果vc编程的话最好使用CFile类等更加方便于文件操作</CA> 
    C++的文件处理函数很多,主要在头文件fstream中包括着。 
    主要有文件的打开open,文件的关闭cloce,以及对文件流进行操作的函数get,put,read,write,getline;对随机文件访问的函数seekg,tellg,seekp和tellp.这些函数各有自己的优缺点,具体的用法可以查找资料或者在MSDN中有详细的程序示例. 
    最自定义对象的读写主要通过输入(>>)输出(<<)运算符的重载来实现的,这也是学习的重点 
    C++基本包含C语言中的所以内容,并且可以在程序中实现。对于C中的缺点,主要是不同的输入输出流造成。 
    1.fopen() 
      fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen实现三个功能:为使用而打开一个流,把一个文件和此流相连接,给此流返回一个FILR指针。 
      参数filename指向要打开的文件名,mode表示打开状态的字符串,其取值如下: 
      字符串 含义 
      "r" 以只读方式打开文件 
      "w" 以只写方式打开文件 
      "a" 以追加方式打开文件 
      "r+" 以读/写方式打开文件,如无文件出错 
      "w+" 以读/写方式打开文件,如无文件生成新文件 
      一个文件可以以文本模式或二进制模式打开,这两种的区别是:在文本模式中回车被当成一个字符’\n’,而二进制模式认为它是两个字符0x0D,0x0A;如果在文件中读到0x1B,文本模式会认为这是文件结束符,也就是二进制模型不会对文件进行处理,而文本方式会按一定的方式对数据作相应的转换。 
      系统默认的是以文本模式打开,可以修改全部变量_fmode的值来修改这个设置,例如_fmode=O_TEXT;就设置默认打开方式为文本模式;而_fmode=O_BINARY;则设置默认打开方式是二进制模式。 
      我们也可以在模式字符串中指定打开的模式,如"rb"表示以二进制模式打开只读文件,"w+t"或"wt+"表示以文本模式打开读/写文件。 
      此函数返回一个FILE指针,所以申明一个FILE指针后不用初始化,而是用fopen()来返回一个指针并与一个特定的文件相连,如果成败,返回NULL,中国自学编程网, www.zxbc.cn  。 
      例: 
       以下是引用片段: 
    FILE *fp; 
      if(fp=fopen("123.456","wb")) 
      puts("打开文件成功"); 
      else 
      puts("打开文件成败"); 
      2.fclose() 
      fclose()的功能就是关闭用fopen()打开的文件,其原型是:int fclose(FILE *fp);如果成功,返回0,失败返回EOF。 
      在程序结束时一定要记得关闭打开的文件,不然可能会造成数据丢失的情况,我以前就经常犯这样的错误。 
      例:fclose(fp); 
      3.fputc() 
      向流写一个字符,原型是int fputc(int c, FILE *stream); 成功返回这个字符,失败返回EOF。 
      例:fputc(’X’,fp); 
      4.fgetc() 
      从流中读一个字符,原型是int fputc(FILE *stream); 成功返回这个字符,失败返回EOF。 
      例:char ch1=fgetc(fp); 
      5. fseek() 
      此函数一般用于二进制模式打开的文件中,功能是定位到流中指定的位置,原型是int fseek(FILE *stream, long offset, int whence);如果成功返回0,参数offset是移动的字符数,whence是移动的基准,取值是: 
      符号常量 值 基准位置 
      SEEK_SET 0 文件开头 
      SEEK_CUR 1 当前读写的位置 
      SEEK_END 2 文件尾部 
      例:fseek(fp,1234L,SEEK_CUR);//把读写位置从当前位置向后移动1234字节(L后缀表示长整数) 
      fseek(fp,0L,2);//把读写位置移动到文件尾 
      6.fputs() 
      写一个字符串到流中,原型int fputs(const char *s, FILE *stream);
    例:fputs("I Love You",fp); 
      7.fgets() 
      从流中读一行或指定个字符,原型是char *fgets(char *s, int n, FILE *stream); 从流中读取n-1个字符,除非读完一行,参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。 
      例:如果一个文件的当前位置的文本如下: 
      Love ,I Have 
      But …….. 
      如果用 
      fgets(str1,4,file1); 
      则执行后str1="Lov",读取了4-1=3个字符,而如果用 
      fgets(str1,23,file1); 
      则执行str="Love ,I Have",读取了一行(不包括行尾的’\n’)。 
      8.fprintf() 
      按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, …]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了。 
      例:fprintf(fp,"%2d%s",4,"Hahaha"); 
      9.fscanf() 
      从流中按格式读取,其原型是int fscanf(FILE *stream, const char *format[, address, …]);其用法和scanf()相同,不过不是从控制台读取,而是从流读取罢了。 
      例:fscanf(fp,"%d%d" ,&x,&y); 
      10.feof() 
      检测是否已到文件尾,是返回真,否则返回0,其原型是int feof(FILE *stream); 
      例:if(feof(fp))printf("已到文件尾"); 
      11.ferror() 
      原型是int ferror(FILE *stream);返回流最近的错误代码,可用clearerr()来清除它,clearerr()的原型是void clearerr(FILE *stream); 
      例:printf("%d",ferror(fp)); 
      12.rewind() 
      把当前的读写位置回到文件开始,原型是void rewind(FILE *stream);其实本函数相当于fseek(fp,0L,SEEK_SET); 
      例:rewind(fp); 
      12.remove() 
      删除文件,原型是int remove(const char *filename); 参数就是要删除的文件名,成功返回0。 
      例:remove("c:\\io.sys"); 
      13.fread() 
      从流中读指定个数的字符,原型是size_t fread(void *ptr, size_t size, size_t n, FILE *stream);参数ptr是保存读取的数据,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是读取的块数,如果成功,返回实际读取的块数(不是字节数),本函数一般用于二进制模式打开的文件中。 
      例: 
       以下是引用片段: 
    char x[4230]; 
      FILE *file1=fopen("c:\\msdos.sys","r"); 
      fread(x,200,12 ,file1);//共读取200*12=2400个字节 
      14.fwrite() 
      与fread对应,向流中写指定的数据,原型是size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);参数ptr是要写入的数据指针,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是要写的块数,如果成功,返回实际写入的块数(不是字节数),本函数一般用于二进制模式打开的文件中。
    例: 
       以下是引用片段: 
      char x[]="I Love You"; 
      fwire(x, 6,12,fp);//写入6*12=72字节 
      将把"I Love"写到流fp中12次,共72字节 
      15.tmpfile() 
      其原型是FILE *tmpfile(void); 生成一个临时文件,以"w+b"的模式打开,并返回这个临时流的指针,如果失败返回NULL。在程序结束时,这个文件会被自动删除。 
      例:FILE *fp=tmpfile(); 
      16.tmpnam(); 
      其原型为char *tmpnam(char *s); 生成一个唯一的文件名,其实tmpfile()就调用了此函数,参数s用来保存得到的文件名,并返回这个指针,如果失败,返回NULL。 
      例:tmpnam(str1);
    fseek函数是 用来设定文件的当前读写位置.
    函数原型: int fseek(FILE *fp,long offset,int origin);
    函数功能:把fp的文件读写位置指针移到指定的位置.
    fseek(fp,20,SEEK_SET); 意思是把fp文件读写位置指针从文件开始后移20个字节.


    ftell函数是用来获取文件的当前读写位置;
    函数原型: long ftell(FILE *fp)
    函数功能:得到流式文件的当前读写位置,其返回值是当前读写位置偏离文件头部的字节数.
    ban=ftell(fp); 是获取fp指定的文件的当前读写位置,并将其值传给变量ban.


    fseek函数与ftell函数综合应用:
    分析:可以用fseek函数把位置指针移到文件尾,再用ftell函数获得这时位置指针距文件头的字节数,这个字节数就是文件的长度.
    #include <stdio.h>
    main()
    {
     FILE *fp;
     char filename[80];
     long length;
     printf("输入文件名:");
     gets(filename);
     //以二进制读文件方式打开文件
     fp=fopen(filename,"rb");
     if(fp==NULL)
        printf("file not found!\n");
     else
        {
           //把文件的位置指针移到文件尾
            fseek(fp,OL,SEEK_END);
           //获取文件长度;
            length=ftell(fp);
            printf("该文件的长度为%1d字节\n",length);
            fclose(fp);
    展开全文
  • 简单的读写文件C++代码 //读文件一 string fileName; std::ifstream inputFile(fileName.c_str()); if(!inputFile) { std::cerr ; return NULL; } inputFile.seekg(0, ios::end);
  • linux C++ 读写文件

    千次阅读 2014-06-10 15:16:12
    从现在开始,进行linux的学习了,开始呢,总想着,windows下的C++已经很熟悉了,所以呢,linux'下的c编程,应该就很快上手,上来就不应该从0开始了,可渐渐发现,根本不是这样的,即使是一个简单的文件读写操作,也...
  • C++ 读写文件的简单封装

    千次阅读 2014-07-14 11:40:53
    说道文件读写,有很多方法,
  • C++读写文件并排序

    千次阅读 2013-07-30 12:47:39
    比如一条记录是 1987 9 2 ...最后输出到新的文件中,按照年龄由大到小。 #include "stdafx.h" #include #include #include #include #include using namespace std; int _tmain(int argc, _T
  • 文件
  • C++读写txt文件(基本操作1)

    万次阅读 多人点赞 2017-11-30 17:49:02
    本博客主要了用C++读写txt本文的基本操作,最简单的写入和读出两个基本操作。 本程序的功能是向Test.txt文件文件写入字符串"This is a Test12!"和读取字符串"This is a Test12!",并且将读取到的字符串存到temp...
  • 1.setprecision()函数的使用及头文件? 2.利用getline()怎么读取一行...数据到txt文件 //其中的setprecision()函数在头文件iomanip 中 void WriteBeamCoreToFile(string fileName, vector&lt;Point2f&g...
  • 二、C++操作json文件 1、jsoncpp 库下载 2、C++从字符串中读取json 3、C++文件中读取json 4、C++写入json文件 5、主函数 附:jsoncpp库配置 1、解压并转移 2、配置属性 3、配置项目 前言 json文件是...
  • C++读写文本文件

    千次阅读 2014-01-01 15:36:36
    首先看看C++中读写文本文件的基本知识: C++简单读写文本文件 fstream提供了三个类,用来实现C++文件的操作。 fstream 打开文件供读写 ofstream 向文件写入内容 ifstream 从已有的文件文件打开模式 iso::...
  • Linux C++ 文件读写

    千次阅读 2020-02-03 11:52:11
    Linux C++ 文件读写判断文件是否存在创建新文件读取文件内容向文件写入内容 判断文件是否存在 可以使用 ifstream 来判断文件是否存在 void check_file_test(char const *filePath) { /...
  • C++ 读写txt文件

    千次阅读 2018-08-16 21:35:51
    C++ 读写txt文件C++ 读写txt文件类 代码如下: 运行结果: 封装一个C++简单的类,用于读写txt文件。 代码如下: comFile.h #pragma once #include &lt;iostream&gt; #include &...
  • C++ 读写TXT文件

    万次阅读 多人点赞 2018-07-28 16:36:31
    一、文件的输入输出 二、从txt文件中读取二维数组(int 以及string) 三、从txt文件读取的数据存到struct中   参考博客:https://blog.csdn.net/u013749068/article/details/78761553  ...
  • c++写日志文件

    热门讨论 2012-04-11 11:31:11
    利用C++写工程日志文件,提供了一个简单的日志文件类,可以方便使用。
  • c++文件读写操作

    万次阅读 多人点赞 2018-04-17 11:07:00
    近期适配几款游戏的数据,因为重复量太大,因此一个对数据进行处理的程序,下面是整个...fstream提供了三个类,用来实现c++文件的操作(文件的创建、读、) ifstream -- 从已有的文件读入 ofstream -- 向...
  • C/C++读写文本文件、二进制文件

    万次阅读 多人点赞 2017-12-13 10:44:11
    C语言文本文件读写方式;C语言二进制文件读写方式;CPP文本文件读写方式;CPP二进制文件读写方式;
  • 内存映射和分页读写可以解决这个问题,小弟对于读操作没疑问,对于就有一个难题: 举例: 一个文件分成n页,我获取了第2页的内容,如果我要对第二页的内容插入或者删除部分字符,这就影响了该页的实际长度,为了...
  • //中间有读写文件操作 int i; i = file.tellg(); file >> str1; file.seekg(i); file >> str2; ``` 请问 这两个 str为什么不一样 我确认 在file>>str1和file>>str2这两个语句之前 seekg() 返回的值是一样的
  • C++读写二进制文件

    千次阅读 2016-07-23 11:40:05
    C++提供了以下类执行从文件输出字符或者输入字符到文件里: ofstream:写文件的Stream 类 ifstream:读取文件的Stream 类: fstream:读/写文件的Stream 类。
  • c++读写二进制文件

    千次阅读 2013-12-18 19:35:34
    c++读写二进制文件,在windows与linux下可能会有不同的效果。本人的一个小例子在linux下写入二进制数据正常,而在windows下面写入数据的过程中,竟然自动添加了0x25等等一些无意义的字节,找了好久才发现这个bug。...
  • C++读写配置文件(boost)

    千次阅读 2019-06-19 20:02:13
    C++读写配置文件Boost安装Boost读取配置文件修改配置文件写文件的形式初始化配置文件读取整个文件END Boost Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++...
  • C++读写Excel文件

    万次阅读 2016-06-16 14:59:48
    在处理仪表数据时需要对Excel文件进行读写操作,本文对C++操作Excel的方法做一个小结。 环境: 1. Visual Studio 2010 2. 安装office2007 3. Win7   1、添加OLE/COM支持。 首先,应用程序必须添加对OLE/...
  • C++文件进行读写操作

    万次阅读 多人点赞 2017-11-17 16:53:13
    文件进行读写操作首先必须要定义一个数据流对象指针,数据流对象指针有三种类型,它们分别是: Ifstream:表示读取文件流,使用的时候必须包含头文件“ifstream”; Ofstream:表示文件写入流,使用的时候必须包含...
  • C++ 读写utf-8文件

    千次阅读 2016-12-27 14:44:24
    C++编码时有时会用到读写utf-8文件c++11新特性里给了新的解决办法。
  • C++文件读写操作及文件中指定内容的获取

    千次阅读 多人点赞 2019-06-12 19:36:36
    C++文件读写操作及文件中指定内容的获取2、关于struct与union的大小计算方式总结 目的:从文件中(文件格式如下图)获取x,y的数值,通过形参argvfanhuo并输出到txt文本中 通过c++的实现代码如下: #include &...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,107,016
精华内容 442,806
关键字:

c++写文件

c++ 订阅