我需要对具有特定扩展名 (*.bob) 的文件列表进行一些操作,这些文件都存储在同一目录中。这些文件是图像帧,它们的名称格式是 frame_XXXX.bob。我不知道先验的帧数,我需要确保按顺序处理它们(从第 0 帧到最后一个)。我用 读取了文件夹的内容struct dirent *readdir(DIR *dirp)
,但由于它不能保证文件将按字母顺序读取(即使它似乎总是如此),我想将它们放入单个链表中,然后在进一步处理之前对它们进行排序. 我先保存列表的头部,然后再将其填充到指针filesListStart
,然后读取整个文件夹内容,如果每个条目具有“.bob”扩展名,则将其添加到列表中。当我有多达 100 帧时,这一切都很好,但由于某种原因,超出了这一点 - 指针filesListStart
指向的值不再包含列表中第一个条目的文件名。该代码不使用任何数字,所以我不知道超过 100 个元素的意义是什么。我在开始填充列表之前和之后写出了内存地址filesListStart
,它们是相同的,但是它们显示的值会神奇地改变。当我将filesListStart
它设置为指向字段fileName
等于“frame_0000.bob”的对象时(这是预期的),但在填充列表后,它指向的名称变为“e_0102.bob”。
列表结构定义为
// List structure
struct FilesList {
char *fileName ;
struct FilesList *next ;
} ;
有问题的代码是:
DIR *moviesDir ;
moviesDir = opendir("movies") ;
if(moviesDir == NULL)
{
printf("Make Movie failed to open directory containing bob frames\n") ;
return ;
}
struct dirent *dirContent ;
// Get first .bob frame name from the directory
dirContent = readdir(moviesDir) ;
// isBobFile(dirContent) returns 1 if entry has ".bob" extension and 0 otherwise
while( !isBobFile(dirContent) )
{
dirContent = readdir(moviesDir) ;
}
struct FilesList *filesList = (struct FilesList*)
malloc( sizeof(struct FilesList) ) ;
// Initialize the list start at that first found .bob frame
filesList->fileName = dirContent->d_name;
// And save the head of the list
struct FilesList *filesListStart = filesList ;
printf("FilesListStart: %s\n", filesListStart->fileName) ;
printf("Address is: %p\n", filesListStart) ;
// For all other bob frames
while( (dirContent = readdir(moviesDir) ) != NULL )
{
if( isBobFile(dirContent) )
{
struct FilesList *temporaryNode = (struct FilesList*)
malloc( sizeof(struct FilesList) );
temporaryNode->fileName = dirContent->d_name ;
filesList->next = temporaryNode ;
filesList = temporaryNode ;
}
}
// Set the 'next' pointer of the last element in list to NULL
filesList->next = NULL ;
// close stream to directory with .bob frames
closedir(moviesDir) ;
// Check what FilesListStart points at
printf("FilesListStart: %s\n", filesListStart->fileName) ;
printf("Address is: %p\n", filesListStart) ;
// Rest of the code