• c++文件流


    前言

    文件流能够从文件系统中读取数据并向文件中写入数据。
    文件输入流适用于读取配置数据、读取保存的文件以及批处理基于文件的数据等任务。Fprintf,fwrite,fputs
    文件输出流适用于保存状态数据和提供输出等任务。Fscanf/fread/fgets.

    文件打开

    需要在文件中包含fstream  
    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(inputfile stream)和ofstream(outputfile stream),ifstream默认以输入方式打开文件,而ofstream默认以输出方式打开文件。
      ifstreamfile2(“c:pdos.def”);//以输入方式打开文件
      ofstreamfile3(“c:x.123”);//以输出方式打开文件

    • 文本文件的读写
      文本文件的读写很简单:用插入器(<<)向文件输出;用析取器(>>)从文件输入。假设file1是以输入方式打开,file2以输出打开。示例如下:
        file2<<”ILove You”;//向文件写入字符串”ILove You”
        inti;
        file1>>i;//从文件输入一个整数值。
    • 二进制文件的读写
      ①put()
        put()函数向流写入一个字符,其原型是ofstream&put(char ch),使用也比较简单,如file1.put(‘c’);就是向流写一个字符’c’。
        ②get()
        get()函数比较灵活,有3种常用的重载形式:
        一种就是和put()对应的形式:ifstream&get(char&ch);功能是从流中读取一个字符,结果保存在引用ch中,如果到文件尾,返回空字符。如file2.get(x);表示从文件中读取一个字符,并把读取的字符保存在x中。
        另一种重载形式的原型是:intget();这种形式是从流中返回一个字符,如果到达文件尾,返回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(unsignedchar *buf,int num);
        write(constunsigned char *buf,int num);
        read()从文件中读取num个字符到buf指向的缓存中,如果在还未读入num个字符时就到了文件尾,可以用成员函数intgcount();来取得实际读取的字符数;而write()从buf指向的缓存写num个字符到文件中,值得注意的是缓存的类型是unsignedchar *,有时可能需要类型转换。
        
      unsignedchar str1[]="I Love You";
        intn[5];
        ifstream in("xxx.txt");
        ofstream out("yyy.txt");
        out.write(str1,strlen(str1));//把字符串str1全部写到yyy.yyy中
        in.read((unsignedchar*)n,sizeof(n));//从xxx.xxx中读取指定个整数,注意类型转换
        in.close();
      out.close();
      View Code

    检测EOF

    成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0。原型是inteof();
    例: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个字节.
      tell:查询流的当前位置。
     

    例子

    #include "FileLog.h"
    #include <Windows.h>
    #include <time.h>
    #include <sstream>
    using namespace std;
    //获取当前路径目录
    
    //取EXE所在路径
    CString GetModuleDir() 
    { 
        HMODULE module = GetModuleHandle(0); 
        char pFileName[MAX_PATH]; 
        GetModuleFileName(module, pFileName, MAX_PATH); 
    
        CString csFullPath(pFileName); 
        int nPos = csFullPath.ReverseFind( _T('\') ); 
        if( nPos < 0 ) 
            return CString(""); 
        else 
            return csFullPath.Left( nPos ); 
    }
    
    //获取dsp所在工作路径
    CString GetWorkDir() 
    {  
        char pFileName[MAX_PATH]; 
        int nPos = GetCurrentDirectory( MAX_PATH, pFileName); 
    
        CString csFullPath(pFileName);  
        if( nPos < 0 ) 
            return CString(""); 
        else 
            return csFullPath; 
    }
    
    
    
    string m_filename = "E:\Program Files\file.txt";
    FileLog::FileLog(void)
    {   
        m_fileStream.open(m_filename,ios_base::app);
        //如果文件目录不存在,创建文件肯定失败
        if (!m_fileStream.good())
        {
            throw runtime_error("File is not Eisit");
        }
    }
    //用户访问唯一实例方法只有这成员函数
    FileLog* FileLog::LogInstance()
    {
        static FileLog m_instance;
        return &m_instance;
    }
    
    void FileLog::WriteLog(const string& message,const string & megLevel)
    {
        //获取当前时间
        SYSTEMTIME start;
        GetLocalTime(&start);
        string strTime;
        std::stringstream strStream;
        strStream<<start.wYear<<"-"<<start.wMonth<<"-"<<start.wDay<<"-";
        strStream<<start.wHour<<":"<<start.wMinute<<':'<<start.wSecond;
        //写入字符串
        strStream>>strTime;
        //写入文本文档
        m_fileStream<<"时间为"<<strTime;   
        strStream.clear();  
        m_fileStream<<message<<endl;
    
        //CString strTime = CString.Format()
        //string strTime = string.
        //m_fileStream<<start.
    }
    
    
    FileLog::~FileLog(void)
    {
        m_fileStream.close();
    }
    View Code

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    从多渠道打包与友盟统计有这一篇就够了
    多渠道打包
    studio构建错误Element uses-permission#android.permission.ACCESS_NETWORK_STATE at AndroidManifest.xml:38:5-79 dupli
    ADB命令与monkey
    正则表达式和文本挖掘(Text Mining)
    一步一步教你使用Git
    Android常见开源解决方案
    Android Intent到底能做些什么
    支付宝集成
    Theano 学习三 conv2d
  • 原文地址:https://www.cnblogs.com/polly333/p/4705662.html
Copyright © 2020-2023  润新知