私は、(FatFsを使用して)SDカードからファイル名を読み取り、それらを画面に表示するコードを開発しています。ここに私が働いているもののsnipetだ予想通り、これはカード上のファイルを出力します -文字列へのポインタから文字列をコピー
FRESULT result;
char *path = '/'; //look in root of sd card
result = f_opendir(&directory, path); //open directory
if(result==FR_OK){
for(;;){
result = f_readdir(&directory, &fileInfo); //read directory
if(result==FR_OK){
if(fileInfo.fname[0]==0){ //end of dir reached
//LCD_UsrLog("End of directory.\n");
break;
}
if(fileInfo.fname[0]=='.')continue; //ignore '.' files
TCHAR *fn_ptr; //file name, why a pointer?
fn_ptr=&fileInfo.fname; //get file name
LCD_UsrLog("%s\n",fn_ptr);
for(delay=0;delay<0x0FFFFF;delay++){ShortDelay();} //delay to display
}//end result==fr_ok
}//end for
}//end result==fr_ok
typedef char TCHAR
と
typedef struct {
DWORD fsize; /* File size */
WORD fdate; /* Last modified date */
WORD ftime; /* Last modified time */
BYTE fattrib; /* Attribute */
TCHAR fname[13]; /* Short file name (8.3 format) */
} FILINFO。
処理のためにファイルの名前を配列にコピーする必要がありますが、私はいくつかの方法を試しましたが、配列の動作ができないようです。私は、TCHARの任意の大きな配列を作成しようとし、ファイル名ポインタの参照を外しましたが、これはゴミを印刷します。
FRESULT result;
char *path = '/'; //look in root of sd card
TCHAR fileList[50];
u32 index=0;
result = f_opendir(&directory, path); //open directory
if(result==FR_OK){
for(;;){
result = f_readdir(&directory, &fileInfo); //read directory
if(result==FR_OK){
if(fileInfo.fname[0]==0){ //end of dir reached
//LCD_UsrLog("End of directory.\n");
break;
}
if(fileInfo.fname[0]=='.')continue; //ignore '.' files
TCHAR *fn_ptr; //file name, why a pointer?
fn_ptr=&fileInfo.fname; //get file name
fileList[index]=*fn_ptr;
LCD_UsrLog("%s\n",fileList[index]);
for(delay=0;delay<0x0FFFFF;delay++){ShortDelay();} //delay to display
index++;
}//end result==fr_ok
}//end for
}//end result==fr_ok
私は、これは、ポインタや文字の配列の適切な使用に関する単純なミスである疑いがあるが、私は最後のCに触れてきたので、それが4年以上されていると私は迷ってしまいました!
ご協力いただければ幸いです。
これは完璧です。迅速な対応をありがとうございました。今度は、ファイルリストのサイズを動的に変更するようにfileList配列を変更する方法を検討しなければならないでしょう(私はおそらくすぐに別の質問に戻ってくるでしょう!) – David
Peter、2番目のアプローチ、つまり多次元配列?これは、ファイル名の印刷をはるかに複雑にしているので、私は(まだ)どんな利益も見られません。 – David
@Davidの利点は、メモリがスタックに割り当てられているため、範囲外になると自動的に解放されることです。動的割り当てを使用すると、メモリを手動で解放する必要もあります。そうしないと、メモリリークが発生します。 –