在 Ubuntu(Linux)下使用 readdir 报错,常见原因和排查思路如下。先说明一点:readdir 本身不会“凭空报错”,通常是参数错误、目录未打开、或头文件/链接问题导致的。
opendirreaddir 必须作用于 DIR *,不能直接传普通指针。
❌ 错误示例:
DIR *dir;
readdir(dir); // dir 未初始化
✅ 正确示例:
#include <dirent.h>
DIR *dir = opendir(".");
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
opendir 返回 NULL,但你没检查,导致后面 readdir 段错误(Segmentation fault)。
检查方式:
ls -ld /your/path
代码中一定要:
if (dir == NULL) {
perror("opendir");
}
缺少头文件会导致隐式声明,编译期或运行期异常。
必须包含:
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
readdir 的返回值判断错误readdir 出错和结束都返回 NULL,需要看 errno:
#include <errno.h>
errno = 0;
entry = readdir(dir);
if (entry == NULL && errno != 0) {
perror("readdir");
}
readdir⚠️ readdir 不是线程安全函数
readdir_r(已逐步淘汰)readdir + 加锁scandir / getline 等替代方案C 程序通常不需要额外链接,但确认:
gcc test.c -o test
如果是 C++:
g++ test.cpp -o test
| 报错现象 | 原因 |
|---|---|
| Segmentation fault | dir 为 NULL |
| implicit declaration | 没 include <dirent.h> |
| No such file or directory | 路径错误 |
| Permission denied | 权限不足 |
| readdir: Bad file descriptor | 目录已 closedir |
#include <dirent.h>
#include <stdio.h>
#include <errno.h>
int main() {
DIR *dir = opendir(".");
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
if (errno != 0)
perror("readdir");
closedir(dir);
return 0;
}
你可以直接贴出:
我可以精准指出是哪一行、为什么报错。