博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++操作io常见命令
阅读量:5293 次
发布时间:2019-06-14

本文共 5121 字,大约阅读时间需要 17 分钟。

用c++练习下 系统常见io命令。

1)显示文档的文本
2)统计文本单词数字
3)列出目录所有文件  ,递归思路
4)查找第一个匹配的字符.
5)文本单词排序,  快速排序,其实还是递归思路
6)文本单词排序后去除重复.

 

  除了3和6,可以练下手,其他没太大意义。

 

command.h

#ifndef COMMAND_H_INCLUDED#define COMMAND_H_INCLUDED#include 
#include
#include "utility.h"#include "io.h"#include "stdio.h"using namespace std;class command{public: int wc(const string&,const char); void cat(const string&); void ls(const string& _path,int ); int search_index(const string&,const string&); //void ls(const string&); vector
getwords(const string&); vector
sort_q(const vector
&); vector
unique_w(const vector
&);};vector
command::unique_w(const vector
& _ws){ vector
temp; string comparestr=""; for(int i=0;i!=_ws.size();++i) { if(_ws[i]!=comparestr) { temp.push_back(_ws[i]); comparestr=_ws[i]; } } return temp;}vector
command::getwords(const string& _filename){ vector
Ret; ifstream in; Utility::open_file(in,_filename); string line; while(getline(in,line)) { int frontP=0; for(int i=0;i!=line.size();++i) { if(line[i]==' '||line[i]==','||i==line.size()-1) { Ret.push_back(line.substr(frontP,i-frontP)); frontP=i+1; } } } return Ret;}vector
command::sort_q(const vector
& _ws){ return Utility::sort_quick(_ws);} int command::wc(const string& _filename,const char _option){ int RSTcount=0; switch(_option) { case 'w': { ifstream in; Utility::open_file(in,_filename); string line; while(getline(in,line)) { for(int i=0;i!=line.size();++i) { if(line[i]==' '||line[i]==',') { ++RSTcount; } } ++RSTcount; } } case 'c': { //统计字符。 } } return RSTcount;}void command::cat(const string& _filename){ ifstream in; Utility::open_file(in,_filename); string line; while(getline(in,line)) { cout<
<
files; _finddata_t tmpfile; //测试发现第一个file的句饼一般是.,所以tmpfile不处理. long lfDir= _findfirst(dir.c_str(),&tmpfile); if(lfDir!=-1l) { while(_findnext(lfDir,&tmpfile)==0) { string space; for(int i=0;i!=l;++i) { space+=" "; } if(tmpfile.attrib==_A_SUBDIR&&(tmpfile.name[0])!='.')//好像有隐藏的.和..文件夹,代表上一个文件夹.这里要去掉. { printf("%s%s\n",space.c_str(),tmpfile.name); ls(_path+"\\"+tmpfile.name,l+1);//习惯了自增++,这里只是要把l+1后传给参数.本身不需要加1. } else if(tmpfile.attrib!=_A_SUBDIR)//没有文件属性.只能用非文件来替换.以免上面的,上一文件夹..到这里. { printf("%s%s\n",space.c_str(),tmpfile.name); } } } _findclose(lfDir);}int command::search_index(const string& _word,const string& _filename){ ifstream in; Utility::open_file(in,_filename); string line; string lines; while(getline(in,line)) { lines+=line; } int position=0; bool pitch=false; for(position=0;position!=lines.size();++position) { int index=0; pitch=true; for(index=0;index!=_word.size();++index) { if(lines[position+index]!=_word[index]) { pitch=false; break; } } if(pitch) { break; } } if(pitch) { return position; } else { return -1; }}#endif // COMMAND_H_INCLUDED

  

 

utility.h

#ifndef UTILITY_H_INCLUDED#define UTILITY_H_INCLUDED#include 
#include
using namespace std;namespace Utility{ifstream& open_file(ifstream&,const string&);vector
sort_quick(const vector
_words);}ifstream& Utility::open_file(ifstream& _in,const string& _filename){ _in.close(); _in.clear(); _in.open(_filename.c_str()); return _in;}//快速排序,性能应该需要优化下.但思路是快速排序思路.vector
Utility::sort_quick(const vector
_words){ if(_words.size()>=2) { string compareStr=_words[0]; vector
left; vector
right; for(int i=1;i!=_words.size();++i) { if(_words[i]>=compareStr) { right.push_back(_words[i]); } else { left.push_back(_words[i]); } } left=sort_quick(left); right=sort_quick(right); left.push_back(compareStr); for(int i=0;i!=right.size();++i) { left.push_back(right[i]); } return left; } else { return _words; }}#endif // UTILITY_H_INCLUDED
 
 

 

main.cpp

void mainCommand(){    command cmd;    string filename="text.txt";    //显示文本    cmd.cat(filename);    //统计单词数字    int couta=cmd.wc(filename,'w');    cout<<"words:"<
<
Words=cmd.getwords(filename); vector
sort_words=cmd.sort_q(Words); for(int i=0;i!=sort_words.size();++i) { cout<
<
unique_words=cmd.unique_w(sort_words); for(int i=0;i!=unique_words.size();++i) { cout<
<

 

文件大小

long getFileSize6(const char* strFileName)

{
    std::ifstream in(strFileName);
    if (!in.is_open()) return 0;
    in.seekg(0, std::ios_base::end);
    std::streampos sp = in.tellg();
    return sp;
}

 

 

追加数据。

 

基本步骤:

//读写打开文档.
//定位输出位置.
//存储会被抹去的数据到临时区.
//写入目标数据.
//再补充被抹去的数据.
fstream fs(file.c_str(),ios::in|ios::out);
string line;
fs.seekg(2,ios::beg);
getline(fs,line);
fs.seekp(2,ios::beg);
fs<<"123"<<flush;
fs<<line<<endl;
fs.close();

//ios::beg: 文件开头
//ios::cur: 文件当前位置
//ios::end: 文件结尾

//seek 查询,重定位

//tell 告诉,返回.

//g (get) 输入流,p (put) 输出流.
//3种流,都只有一个状态数据来表示位置.当读写流时要切换位置时候,必须用 seekg或seekp来重定位读写位置.

 

如果读入确定的字符用。is.read:(p,size)

如果不确定字符,用 is.get(p,size,'')

因为测试发现,用 is.get,当只有前2个参数,不知道为什么会少一个字符。可能是默认把最后一个字符当成分隔符,留在流中?

转载于:https://www.cnblogs.com/lsfv/p/5843090.html

你可能感兴趣的文章
ArrayList,LinkedList的对比
查看>>
eclipse 最简单的方法 显示行号
查看>>
Winform应用ssk皮肤
查看>>
Java实现二叉树先序,中序,后序遍历
查看>>
Hello World
查看>>
java 打印栈信息
查看>>
解决flex4 分辨率自适应问题
查看>>
表扫描和索引扫描
查看>>
移动硬盘加密!让windows用户无法查看移动硬盘!
查看>>
部署Flask项目到腾讯云服务器CentOS7
查看>>
使用python实现京东抢购脚本
查看>>
登录之后更新导航
查看>>
saddle中每一个属性赋值给到WebPlate中的同名属性
查看>>
图论专题考试2 爆零祭
查看>>
21.centos7基础学习与积累-007-远程连接
查看>>
获取当前日期和随机数
查看>>
透视ERP会计科目 (转自SAP屠夫的博客)
查看>>
0049 MyBatis关联映射--一对一关系
查看>>
解决ultravnc在win2008 R2下CTRL+ALT+DELETEA组合键发送失败的问题
查看>>
Ceph相关
查看>>