標籤:

C/C++ 適合用什麼方式去讀取批量有序的文件名?

程序中有一個 SDL_image 的函數

SDL_Surface *IMG_Load(const char *file);

它需要一個 const char * 的字元串,來讀取硬碟上的圖片文件。

本地的圖片文件名格式為 my1.jpg, my2.jpg, my3.jpg...,所有文件名前綴一致,數字遞增。

因為需要在多個源文件 / 函數中讀取圖片位置,我定義了一個全局數組,把文件名存儲在數組中。

想到以下三種方式實現文件名讀取,但覺得三種都比較複雜。

第一種方式(利用指向二維數組的指針,傳遞給函數):

#include &
#include &

using namespace std;

const unsigned img_num = 113;

typedef char (*img_arr)[20];

img_arr file_name(char (*arr)[20])
{
for (unsigned i = 0; i &< img_num; ++i) { sprintf(arr[i], "my%u.jpg", i); } return arr; } int main() { char myimg[img_num][20] = {0}; const char (*const pimg)[20] = file_name(myimg); for (unsigned i = 0; i &< img_num; ++i) { cout &<&< pimg[i] &<&< endl; } return 0; }

第二種(函數返回一個帶二維數組的結構體,參考代碼:c++如何自定義一個返回二維數組的函數而不是首地址? - Milo Yip 的回答):

#include &
#include &

using namespace std;

const unsigned img_num = 113;

struct IMG_ARR {
char img[img_num][20];
};

IMG_ARR file_name()
{
IMG_ARR arr;

for (unsigned i = 0; i &< img_num; ++i) { sprintf(arr.img[i], "my%u.jpg", i); } return arr; } int main() { IMG_ARR my = file_name(); for (unsigned i = 0; i &< img_num; ++i) { cout &<&< my.img[i] &<&< endl; } return 0; }

第三種 (人工寫出圖片位置):

#include &

using namespace std;

const char *myimg[] = {
"my1.jpg", "my2.jpg", "my3.jpg",
// ...
};

int main()
{
for (unsigned i = 0; i &< sizeof(myimg) / sizeof(*myimg); ++i) { cout &<&< myimg[i] &<&< endl; } }

如果資源文件的數量太多,把文件名存放在數組中,似乎不是一個好的想法。如果為每一個函數寫類似這樣的代碼:

char arr[20] = {0};
for (unsigned i = 0; i &< 113; ++i) sprintf(arr, "my%u.jpg", i);

也會顯得很冗雜,是否有更好的方式去讀取文件名?


為什麼不用 vector& ?你沒有任何理由不在這裡用標準庫的vector與string(或者任何類似的包裝過的設施)。

請問如果需要獲取字元串中的欄位,用string::substr()會不會很耗時?

載入個資源而已,根本輪不到考慮這種鳥事情的耗時。

什麼東西需要考慮耗時?比如「每秒鐘需要渲染100次,每次不能超時」這種事情。

看了一下,你說的三種方式都並不複雜

當然,如果我來設計的話,或許會搞成全局函數做API的方式

const char *get_file_name(int id);

int get_number_of_file();

這樣,然後調用處就不需要關心你的數據是怎麼組織的了。沒有比vector&更合適的場景了。過早的優化是萬惡之源

在確定是性能瓶頸之前不用考慮相比讀文件名這個問題,我更關心圖片文件讀入內存後的處理,這才是影響程序效率的地方


最簡單的做法是定義一個數組或者使用標準容器啊,有多少張圖片就循環讀取多少次啊,過早優化相當於自掘墳墓啊


改變下介面,變成load(prefix,seq), 每次直接拼


推薦閱讀:

C++ 程序員有必要熟練使用除標準庫以外的第三方庫嗎?
如何解決 C++ 代碼不能打開提示有一個錯誤的問題?
什麼時候適合使用 C++ 而不是 C?
C++中char是如何在地址中存儲的?

TAG:C |