参考:
[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");
}
网友评论