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

2020-01-25  本文已影响0人  Optimization

参考:

[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");
}
上一篇下一篇

猜你喜欢

热点阅读