g++ 的使用
g++的安装升级
#安装gcc
sudo apt-get install gcc
#安装g++
sudo apt-get install g++
c++ 编译
g++ -o 【生成目标文件名】 【c++代码源文件】
命令行传参
使用命令行传参时使用此 main 函数
argc 表示传入参数个数
argv 用来访问参数,0 为程序的名称,1 到 argc-1 为用户传入的参数
int main(int argc, char* argv[])
举例
int main(int argc, char* argv[]){
cout << argv[1] << endl;
}
./【文件名】 hello, world
#输出 hello, world
实现单词统计
文件操作
使用<fstream>头文件
fstream file; file.open (filename.c_str(),ios::in);
由于传参时使用的 filename 时 string 类型,此时需要转换为 c 字符串。
当文件使用完毕,使用 file.close 关闭文件。
通过 file.get( ) 逐个访问文件中的字符。
统计原理
设定两个状态,单词状态和分隔符状态(非单词状态),初始状态设置为分隔符状态。
当文件逐个字符读取时,状态从非单词状态改变为单词状态时,视为单词 +1。
#define s_out 0
#define s_in 1
#define init s_out
区分非单词
使用 string 的库函数 find,查找出当前读取字符是否为分隔符,当结果为否时,find 函数会返回 npos 表示空。
分隔符有:空格 \n \t " ' + - , 。 ; (也可以根据需要修改,字符串中表示"需要添加\转义)
bool splite(char c) {
const string split_chars = " \n\t\"'+-,.;";
return split_chars.find(c) != string::npos;
}
最终代码
#include<iostream>
#include<fstream>
#include<string>
#define s_out 0
#define s_in 1
#define init s_out
using namespace std;
bool splite(char c) {
const string split_chars = " \n\t\"'++,.;";
return split_chars.find(c) != string::npos;
}
int count_word(string& filename) {
int count = 0;
bool status = init;
fstream file;
file.open (filename.c_str(),ios::in);
if (!file.is_open()) {
cerr << "open failed" << endl;
return -1;
}
else{
cout << "open sucessfully" << endl;
char c;
while(file.get(c)) {
if(splite(c))
{
status = s_out;
}
else if(status == s_out){
status = s_in;
count++;
}
}
}
file.close();
return count;
}
int main(int argc, char* argv[]){
string filename;
filename = argv[1];
if(!filename.empty()){
cout << "word: " <<count_word(filename) << endl;
}
else{
cout << "the flie "<< filename <<" is empty" << endl;
}
return 0;
}
标签:string,++,c++,单词,int,file,Linux,define
From: https://blog.csdn.net/qq_69580466/article/details/144597489