C++取出string的一部分以及int型轉成string類型


在實際應用中,對文件的操作是十分頻繁的,我們需要對文件進行拷貝,重命名等操作,這是就需要獲取文件的絕對路徑,一般情況下,該路徑是以字符串的形式存儲的,如果我們需要對文件進行重命名等,就需要對絕對路徑這個字符串進行處理,比如獲取這個字符串的某個位置中的一個子字符串等,本片博客針對今天用到的部分字符串的操作函數進行記錄,以便以后再次用到的時候查閱使用,同時,我在寫程序的過程中也參考了許多網上的博客等資料,希望自己的記錄有朝一日也可以幫助到其他人。

首先在windows系統下,采取以下的命令,可以將當前文件夾下以及子文件夾下的所有jpg文件的絕對路徑寫到temp.set文件之中,那么我們就可以依次讀取set文件中的每一行來獲取每個jpg的文件名,如下所示的例子,那么接下來就是對於這個字符串的處理了。

1 dir *.jpg /b/s > tmp.set
 1 D:\VideoRetrieval測試結果\result_case2\20160419095729009-1_[362,5,733,480].jpg\all_result\0.416333_14.jpg
 2 D:\VideoRetrieval測試結果\result_case2\20160419095729009-1_[362,5,733,480].jpg\all_result\0.416405_19.jpg
 3 D:\VideoRetrieval測試結果\result_case2\20160419095729009-1_[362,5,733,480].jpg\all_result\0.416566_14.jpg
 4 D:\VideoRetrieval測試結果\result_case2\20160419095729009-1_[362,5,733,480].jpg\all_result\0.416878_17.jpg
 5 D:\VideoRetrieval測試結果\result_case2\20160419095729009-1_[362,5,733,480].jpg\all_result\0.417536_14.jpg
 6 D:\VideoRetrieval測試結果\result_case2\20160419095729009-1_[362,5,733,480].jpg\all_result\0.417708_21.jpg
 7 D:\VideoRetrieval測試結果\result_case2\20160419095729009-1_[362,5,733,480].jpg\all_result\0.417795_21.jpg
 8 D:\VideoRetrieval測試結果\result_case2\20160419095729009-1_[362,5,733,480].jpg\all_result\0.418242_14.jpg
 9 D:\VideoRetrieval測試結果\result_case2\20160419095729009-1_[362,5,733,480].jpg\all_result\0.418536_7.jpg
10 D:\VideoRetrieval測試結果\result_case2\20160419095729009-1_[362,5,733,480].jpg\all_result\0.418560_14.jpg
11 D:\VideoRetrieval測試結果\result_case2\20160419095729009-1_[362,5,733,480].jpg\all_result\0.418647_14.jpg
12 D:\VideoRetrieval測試結果\result_case2\20160419095729009-1_[362,5,733,480].jpg\all_result\0.418717_21.jpg
13 D:\VideoRetrieval測試結果\result_case2\20160419095729009-1_[362,5,733,480].jpg\all_result\0.418840_14.jpg
14 D:\VideoRetrieval測試結果\result_case2\20160419095729009-1_[362,5,733,480].jpg\all_result\0.419457_14.jpg
15 D:\VideoRetrieval測試結果\result_case2\20160419095729009-1_[362,5,733,480].jpg\all_result\0.419584_21.jpg
16 D:\VideoRetrieval測試結果\result_case2\20160419095729009-1_[362,5,733,480].jpg\all_result\0.419691_14.jpg

首先需要將該文件讀入至內存中,如下所示,可以定義一個string的vector,然后首先將文件的絕對路徑讀入至一個char型的數組中,在讀入的時候需要注意,要跳過空行,以及要將讀取的每一行最后的換行符除掉,換成'\0'以標志該字符串的結束,由於windows系統的換行符是\r\n,因此需要將\n與\n一次去掉,並添加上'\0',然后將轉換好的字符串pushjinruvector中。

 1     std::vector<std::string> vecRes;
 2     FILE*pfin  = fopen(strFN.c_str(), "rb");
 3     char as8Buf[2048] = {0};
 4     while(NULL != fgets(as8Buf, 2048, pfin))
 5     {
 6         if(as8Buf[strlen(as8Buf)-1] == '\n')
 7         {
 8             as8Buf[strlen(as8Buf)-1] = '\0';
 9         }
10         if(as8Buf[strlen(as8Buf)-1] == '\r')
11         {
12             as8Buf[strlen(as8Buf)-1] = '\0';
13         }
14 
15         if (strlen(as8Buf) == 0)
16         {
17             continue;
18         }
19         vecRes.push_back(as8Buf);
20     }
21     fclose(pfin);

可以通過如下的語句獲取絕對路徑中最后的文件名

1     int pos = strFullName.rfind("\\");
2     std::string fn = strFullName.substr(pos + 1, strFullName.length());

string中的rfind是反向查找第一個"\\"這里第一個\是轉義字符,也就是找"\"然后將其所處的位置返回,然后在利用string的substr函數將該位置直至最后的子字符串返回。還可以循環調用上述的函數來獲取上n層的文件夾的名稱,但是需要注意好邊界條件的判斷,考慮到n的各種取值情況,做好if else的判斷。

另外,有時文件名中需要有一些數據信息,比如得分值、ID號等,那么此時就會涉及到字符串與int以及float等類型之間的轉換,這種轉換十分經非常用到,但是每次用的時候都要重新去查,這次記錄下來,只記錄了我采取的方式:

float型轉string:

1 std::to_string(video_ID)

string轉float:

1 float curScore = atof(strScore.c_str());

都需要將#include <string>頭文件包含在內。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM