<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
用慣了python,對其他語言就比較的生疏。但是python很多時候在效能上比較受侷限,這裡嘗試通過C++來實現一個檔案IO的功能,看看是否能夠比python的表現更好一些。關於python的類似功能的實現,可以參考這一篇部落格。
首先我們構造一個txt檔案用於測試,比如以下這個名為mindspore.txt的檔案(之所以取這個名字,是因為最近在研究mindspore,因此最方便拿到的資料就是mindspore的藉口api檔案):
MindSpore Python API
MindSpore Python API
mindspore
mindspore.common.initializer
mindspore.communication
mindspore.compression
mindspore.context
mindspore.dataset
mindspore.dataset.config
mindspore.dataset.text
mindspore.dataset.transforms
mindspore.dataset.vision
mindspore.explainer
mindspore.mindrecord
mindspore.nn
mindspore.numpy
mindspore.nn.probability
mindspore.ops
mindspore.profiler
mindspore.train
MindArmour Python API
mindarmour
mindarmour.adv_robustness.attacks
mindarmour.adv_robustness.defenses
mindarmour.adv_robustness.detectors
mindarmour.adv_robustness.evaluations
mindarmour.fuzz_testing
mindarmour.privacy.diff_privacy
mindarmour.privacy.evaluation
mindarmour.privacy.sup_privacy
mindarmour.utils
MindSpore Hub Python API
mindspore_hub
MindSpore Serving Python API
mindspore_serving
MindQuantum Python API
mindquantum
然後構造一個C++程式碼用於逐行讀取這個檔案,通過getline函數,將獲取到的行字串儲存到strline中,並且每次讀取一行都在螢幕上輸出出來。由於這裡使用的是while迴圈,因此採用index的方案設定了一個跳出迴圈的條件,唯讀取特定的行範圍:
// iofile.cpp #include <iostream> #include <fstream> #include <string> int main() { using namespace std; string filename="mindspore.txt"; ifstream fin(filename.c_str()); int index = 0; string strline; while (getline(fin, strline) && index < 20) { cout << strline << endl; index ++; } fin.close(); cout << "Done!n"; return 0; }
在讀取完畢後,記得使用close()將檔案關閉。上述程式碼的執行結果如下:
dechin@ubuntu2004:~/projects/gitlab/dechin/$ g++ iofile.cpp
dechin@ubuntu2004:~/projects/gitlab/dechin/$ ./a.out
MindSpore Python API
MindSpore Python API
mindspore
mindspore.common.initializer
mindspore.communication
mindspore.compression
mindspore.context
mindspore.dataset
mindspore.dataset.config
mindspore.dataset.text
mindspore.dataset.transforms
mindspore.dataset.vision
mindspore.explainer
mindspore.mindrecord
mindspore.nn
mindspore.numpy
mindspore.nn.probability
mindspore.ops
mindspore.profiler
mindspore.train
Done!
這裡我們使用的g++版本為9.3.0:
dechin@ubuntu2004:~/projects/gitlab/dechin/$ g++ --version
g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
因為上述案例讀取的是前20行的內容,那麼在Linux下我們還可以通過head來檢視前20行的檔案內容:
dechin@ubuntu2004:~/projects/gitlab/dechin/$ head -n 20 mindspore.txt
MindSpore Python API
MindSpore Python API
mindspore
mindspore.common.initializer
mindspore.communication
mindspore.compression
mindspore.context
mindspore.dataset
mindspore.dataset.config
mindspore.dataset.text
mindspore.dataset.transforms
mindspore.dataset.vision
mindspore.explainer
mindspore.mindrecord
mindspore.nn
mindspore.numpy
mindspore.nn.probability
mindspore.ops
mindspore.profiler
mindspore.train
經過對比發現兩個結果是一致的。
我們假象一個這樣的測試案例,在上述的txt文字中,我們想把帶有字元context的那一行標記出來,使其跟其他的行不一樣。這時候就需要使用到C++的字串匹配功能,其格式為string.find("context"),返回的是一個識別碼,用於標記是否存在或者是存在的位置,如果字元不存在,則返回結果等價於string::npos。按照這個思路,我們定義一個布林值,在檢索過程中如果遇到context字元就輸出1,否則輸出0,具體的程式碼實現如下:
// iofile.cpp #include <iostream> #include <fstream> #include <string> int main() { using namespace std; string filename="mindspore.txt"; ifstream fin(filename.c_str()); int index = 0; string strline; while (getline(fin, strline) && index < 20) { bool exists = strline.find("context") == string::npos; cout << strline << 't' << !exists << endl; index ++; } fin.close(); cout << "Done!n"; return 0; }
上述程式碼的執行結果如下所示:
dechin@ubuntu2004:~/projects/gitlab/dechin/$ g++ iofile.cpp && ./a.out
MindSpore Python API 0
MindSpore Python API 0
mindspore 0
mindspore.common.initializer 0
mindspore.communication 0
mindspore.compression 0
mindspore.context 1
mindspore.dataset 0
mindspore.dataset.config 0
mindspore.dataset.text 0
mindspore.dataset.transforms 0
mindspore.dataset.vision 0
mindspore.explainer 0
mindspore.mindrecord 0
mindspore.nn 0
mindspore.numpy 0
mindspore.nn.probability 0
mindspore.ops 0
mindspore.profiler 0
mindspore.train 0
Done!
我們可以注意到,在含有context的那一行的行末輸出了一個1,其他行的行末輸出的都是0.
在python中我們常用的一個功能是匯入time.time()來記錄時間,然後計算兩次時間之間的差值,就可以得到一個程式的精確執行時間。C++中有一個比較類似的用法是clock_t,這裡為了方便測試,我們把上述用到的程式碼封裝到一個reader函數內,然後在main函數中呼叫以及統計執行時間:
// iofile.cpp #include <iostream> #include <fstream> #include <string> #include <time.h> using namespace std; int reader() { string filename="mindspore.txt"; ifstream fin(filename.c_str()); int index = 0; string strline; while (getline(fin, strline) && index < 20) { bool exists = strline.find("context") == string::npos; cout << strline << 't' << !exists << endl; index ++; } fin.close(); cout << "Done!n"; return 0; } int main() { clock_t start, end; start = clock(); reader(); end = clock(); cout << "The time cost is: " << double(end-start)/CLOCKS_PER_SEC << "s" << endl; }
上述程式碼的執行結果如下所示:
dechin@ubuntu2004:~/projects/gitlab/dechin/$ g++ iofile.cpp && ./a.out
MindSpore Python API 0
MindSpore Python API 0
mindspore 0
mindspore.common.initializer 0
mindspore.communication 0
mindspore.compression 0
mindspore.context 1
mindspore.dataset 0
mindspore.dataset.config 0
mindspore.dataset.text 0
mindspore.dataset.transforms 0
mindspore.dataset.vision 0
mindspore.explainer 0
mindspore.mindrecord 0
mindspore.nn 0
mindspore.numpy 0
mindspore.nn.probability 0
mindspore.ops 0
mindspore.profiler 0
mindspore.train 0
Done!
The time cost is: 0.000245s
輸出的時間表示這個函數執行時間共計0.2ms。
本文簡單的介紹了C++中的三種基礎操作:逐行讀取檔案內容、字串匹配以及執行時間的統計,並且通過一個簡單的範例來實現了這三種基本的功能。相比於python而言,C++的程式碼編寫量肯定要多一些,但是考慮到C++可能帶來的效率增益,我們也應當瞭解其基本的用法以及功能實現。
以上就是C++實現檔案逐行讀取與字元匹配的範例詳解的詳細內容,更多關於C++檔案逐行讀取與字元匹配的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45