C/C++ 適合用什麼方式去讀取批量有序的文件名?
程序中有一個 SDL_image 的函數
它需要一個 const char * 的字元串,來讀取硬碟上的圖片文件。
SDL_Surface *IMG_Load(const char *file);
本地的圖片文件名格式為 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])
第二種(函數返回一個帶二維數組的結構體,參考代碼:c++如何自定義一個返回二維數組的函數而不是首地址? - Milo Yip 的回答):
{
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; }
#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&
請問如果需要獲取字元串中的欄位,用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 |