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>头文件包含在内。

 

posted @ 2017-01-17 19:56  rainsoul  Views(2703)  Comments(0Edit  收藏  举报