Mình có một vấn đề về lập trình mong mọi người giúp đỡ. Tôi đang cố gắng học lập trình C cho một nhiệm vụ công việc và tôi đã đặt cho mình một dự án nhỏ liên quan đến việc đọc cây tệp bao gồm tất cả các thư mục con để lấy thông tin về từng tệp.
Vấn đề tôi gặp phải là chương trình của tôi không bỏ qua các đường dẫn thư mục kết thúc bằng /. hoặc /.. Khi nó in tất cả các thư mục, tôi muốn chừa khoảng trống trước các thư mục con để dễ đọc.
Vì vậy lỗi xảy ra ở phần này:
int isDir(const char *parent, char *name) {
struct stat st_buf; // thông tin tệp
char buf[BUF_SIZE];
if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) {
return 0;
}
char *path = malloc(strlen(name) + strlen(parent) + 2);
//sprintf(char *buf, const char *format, [arg1],[arg2],...)
sprintf(path, "%s/%s", cha, name);
stat(đường dẫn, &st_buf); //
trả về S_ISDIR(st_buf.st_mode); //thư mục
}
Dưới đây là chức năng chính và chức năng danh sách:
danh sách int(const char *name) {
TRỰC TIẾP *dirp = opendir(tên);
struct dirent *nha khoa;
char buf[BUF_SIZE];
while ((dentry = readdir(dirp)) != NULL) {
char *dir_name = nha khoa->d_name;
printf(" %s\n", dir_name);
//nếu là dir thì vào dir
if (isDir(name, dir_name)) { //name : cha, dir_name : con
chdir(dir_name);
getcwd(buf, BUF_SIZE);
danh sách(buf);
}
}
closeir(dirp);
}
int main()
{
danh sách(".");
return 0;
}
Kết quả là thế này:
hm1.c
dữ liệu
lab1.txt
kết quả1
lab3.txt
.
..
.
..
kết quả2
lab3.txt
.
..
kết quả3
lab3.txt
.
..
ac
.
..
a.out
Tôi muốn in kết quả
hm1.c
dữ liệu
lab1.txt
kết quả1
lab3.txt
kết quả2
lab3.txt
kết quả3
lab3.txt
ac
a.out
nếu bạn có .
ôi ..
,của bạn isDir
Trả về đúng/sai, trả về sai (hoặc 0), rồi đúng/khác S_ISDIR
giá trị sai
Điều bạn thực sự cần là một hàm trả về một trong ba giá trị: SKIP, isFILE hoặc isDIR, sau đó viết logic in của bạn dựa trên đó.
Bạn cũng cần sửa lỗi rò rỉ bộ nhớ
Cũng xin lưu ý rằngchdir(dir_name);
sẽ thay đổi thư mục thực tế của quy trình, vì vậy khi bạn ở trong vòng lặp từdanh sách
Quay lại và bạn sẽ không thể mở tệp hoặc thư mục mà bạn đang lặp lại (vì hiện tại bạn đang ở trong một thư mục khác)
Điều này sẽ giải quyết vấn đề của bạn và in định dạng bạn muốn
enum { doSkip, isFile, isDir } testDir(char *path, char *name)
{
chỉ số cấu trúc st_buf;
if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) {
trả về doSkip;
}
stat(đường dẫn, &st_buf);
nếu (S_ISDIR(st_buf.st_mode))
trả về isDir;
trả về isFile;
}
danh sách void(const char *path, int indentlevel)
{
TRỰC TIẾP *dirp = opendir(path);
struct dirent *nha khoa;
char buf[10000]; // Hãy tạo bộ đệm đủ lớn cho ví dụ này
nếu (! dirp) {
printf("%*sNo access\n",indentlevel,"");
return;
}
while ((dentry = readdir(dirp)) != NULL) {
sprintf(buf,"%s/%s", path, dentry->d_name);
switch (testDir(buf,dentry->d_name)) {
trường hợp doSkip:
/*không làm gì cả*/
phá vỡ;
trường hợp làDir:
printf("%*s%s:\n",indentlevel,"",dentry->d_name);
danh sách(buf,indentlevel+4);
phá vỡ;
trường hợp isFile:
printf("%*s%s\n",indentlevel,"",dentry->d_name);
phá vỡ;
}
}
closeir(dirp);
}
int main()
{
danh sách(".", 0);
return 0;
}
Tôi là một lập trình viên xuất sắc, rất giỏi!