美文网首页
[陈宗权C++]C++第7天AM--fileIO

[陈宗权C++]C++第7天AM--fileIO

作者: Optimization | 来源:发表于2020-01-25 22:25 被阅读0次

    参考:

    [1] 达内C++教程\03_标准C++编程_陈宗权_7day\标准C++编程_day07AM_fileIO
    [2] C++的那些事:流与IO类

    正文:

    ////day7 am fileio TEST1
    //#include <iostream>
    //#include<fstream>
    //
    //using namespace std;
    //
    //void encode(char* buf, int bytes)
    //{
    //  for (int i = 0; i < bytes; i++) {
    //      ++*buf++;
    //  }
    //}
    //
    //int main(int argc, char* argv[])
    //{
    //  std::cout << "argc: " << argc << std::endl;
    //  for (int i = 0; i < argc; i++) {
    //      std::cout << "argv[" << i << "]: " << argv[i] << std::endl;
    //  }
    //
    //  if (argc != 3) {
    //      std::cout << argv[0] << "源文件  新文件" << std::endl;
    //      return 0;
    //  }
    //
    //  ifstream f1(argv[1], ios::binary | ios::in);
    //  if (!f1) {
    //      std::cout << "打开" << argv[1] << "文件失败" << std::endl;
    //      return 0;
    //  }
    //  // argv[2]这个文件可以不存在,argv[1]这个文件必须存在
    //  ofstream f2(argv[2], ios::binary | ios::out);
    //  if (!f2) {
    //      std::cout << "打开" << argv[2] << "文件失败" << std::endl;
    //  }
    //  // test1
    //  //char buf[10000];
    //  //while (f1)
    //  //{
    //  //  f1.read(buf, sizeof(buf));
    //  //  std::cout << "sizeof(buf): " << sizeof(buf) << std::endl;
    //  //  cout.write(buf, f1.gcount());
    //  //  // gcount():记录实际读取数量,不要用sizeof(buf)
    //  //  encode(buf, f1.gcount());
    //  //  f2.write(buf, f1.gcount());
    //  //  //std::cout << "f1.gcount(): " << f1.gcount() << std::endl;
    //  //}
    //
    //  //// test2
    //  //// read write只关心在哪个地方,多少个字节,不关心是什么类型
    //  //bool buf[10000];
    //  //while (f1)
    //  //{
    //  //  f1.read((char*)buf, sizeof(buf));
    //  //  std::cout << "sizeof(buf): " << sizeof(buf) << std::endl;
    //  //  cout.write((char*)buf, f1.gcount());
    //  //  // gcount():记录实际读取数量,不要用sizeof(buf)
    //  //  encode((char*)buf, f1.gcount());
    //  //  f2.write((char*)buf, f1.gcount());
    //  //  //std::cout << "f1.gcount(): " << f1.gcount() << std::endl;
    //  //}
    //
    //  // test3
    //  // 可以进行强制类型转换reinterpret_cast<char*>()
    //  // static_cast是将void*转为实际的类型
    //  bool buf[10000];
    //  while (f1)
    //  {
    //      f1.read(reinterpret_cast<char*>(buf), sizeof(buf));
    //      std::cout << "sizeof(buf): " << sizeof(buf) << std::endl;
    //      cout.write((char*)buf, f1.gcount());
    //      // gcount():记录实际读取数量,不要用sizeof(buf)
    //      encode((char*)buf, f1.gcount());
    //      f2.write((char*)buf, f1.gcount());
    //      //std::cout << "f1.gcount(): " << f1.gcount() << std::endl;
    //  }
    //
    //  // close函数可以不写 
    //  f1.close();
    //  f2.close();
    //  system("pause");
    //  return 0;
    //
    //}
    
    
    
    //day7 am fileio TEST2
    #include <iostream>
    #include<fstream>
    
    using namespace std;
    
    void encode(char* buf, int bytes)
    {
        for (int i = 0; i < bytes; i++) {
            ++*buf++;
        }
    }
    
    void decode(char* buf, int bytes) 
    {
        for (int i = 0; i < bytes; i++) {
            --*buf++;
        }
    
    }
    
    int main(int argc, char* argv[])
    {
        if (argc != 3 || strcmp(argv[1], "-e") && strcmp(argv[1], "-d")) {
            std::cout << "argv[0]"<<"-e|-d 文件"<< std::endl;
            return 0;
        }
        fstream f1(argv[2], ios::binary|ios::in|ios::out);
        if (!f1) {
            std::cout << "打开" << argv[2] << "文件失败" << std::endl;
            return 1; 
        }
        bool buf[1000000];
        void(*p)(char*, int) = argv[1][1] == 'e' ? encode : decode;
        int pos1 = 0, pos2, bytes;
        bool ok = true;
        //对输入流操作:seekg()与tellg(), seekg():设置输入文件流指针的位置,tellg():返回当前定位的指针位置
        //对输出流操作:seekp()与tellp(),
        //int cnt = 0;
        while (ok) {
            /*cnt++;
            std::cout << cnt << std::endl;*/
            
            f1.seekg(pos1);
            f1.read((char*)buf,sizeof(buf));
            if (!f1) {
                // 清除错误状态,错误状态就是没读满,所以不能直接return
                std::cout <<"f1 is false, f1.gcount(): " <<f1.gcount()<< std::endl;
                f1.clear();
                ok = false;
                //return -1;//
    
            }
            else
                pos2 = f1.tellg();//
            bytes = f1.gcount();
            std::cout <<"f1.gount(): " <<f1.gcount()<< std::endl;
            std::cout <<"sizeof(buf): "<<sizeof(buf) << std::endl;
            p((char*)buf, bytes);
            // XX <- XXX :XXX继承XX
            // ios <- istream ; ios <- ostream 
            // istream,ostream <- iostream
            // istream <- ifstream;ostream <- ofstream 
            // iostream <- fstream
            // 等等看图片
            cout.write((char*)buf,bytes);
            f1.seekp(pos1);
            f1.write((char*)buf,bytes);
            pos1 = pos2;
        }
        f1.close();
        system("pause");
    }
    

    相关文章

      网友评论

          本文标题:[陈宗权C++]C++第7天AM--fileIO

          本文链接:https://www.haomeiwen.com/subject/bksazctx.html