我在C中的fopen()函数有问题。
我解析了目录并将所有路径放到char数组(char **)。之后,我应该打开所有这些文件。和... fopen返回"没有这样的文件或目录"对于一些文件。我真的不明白,为什么。
我该怎么办?
int main(int argc, char *argv[]){
char** set = malloc(10000*sizeof(char*));
char* path = argv[1];
listdir(path, set); /* Just parse directory. Paths from the root. No problem in this function. all paths in the variable "set" are right */
int i=0;
while(i<files){ /* files is number of paths */
FILE* file = fopen(set[i++],"rb");
fseek(file, 0L, SEEK_END);
int fileSize = ftell(file);
rewind(file);
/*reading bytes from file to some buffer and close current file */
i++;
}
}
答案 0 :(得分:1)
试试这段代码:
#include <stdio.h>
#include <sys/stat.h>
/* example of listdir, replace it with your real one */
int listdir(const char *path, char *set[])
{
set[0] = "0.txt";
set[1] = "1.txt";
set[2] = "2.txt";
set[3] = "3.txt";
set[4] = "4.txt";
return 5;
}
int main(int argc, char *argv[]) {
int files;
char *path = argv[1];
char **set = malloc(1000 * sizeof(char *));
files = listdir(path, set);
for (int i = 0; i < files; i++) {
struct stat st;
stat(set[i], &st);
printf("FileSize of %s is %zu\n", set[i], st.st_size);
}
free(set);
}
答案 1 :(得分:0)
(我猜你在某些Posix系统上,希望是Linux)
可能你的listdir
错了。 FWIW,如果你在其中使用readdir(3),你需要连接目录名和文件名(中间有/
,可能使用snprintf(3)或asprintf(3)目的)。
但可以肯定的是,
FILE* file = fopen(set[i++],"rb"); ////WRONG
是双重错误。首先,您要递增i++
两次(现在为时尚早)。然后,你应该阅读fopen(3)并处理失败案例,至少用:
char* curpath = set[i];
assert (curpath != NULL);
FILE* file = fopen(curpath, "rb");
if (!file) { perror(curpath); exit(EXIT_FAILURE); };
必须测试fopen
的失败结果。请注意,我在失败时将相同的 curpath
传递给perror(3)。
您可能还想检查当前的working directory是否符合预期。请使用getcwd(2)。
还可以使用strace(1)(在Linux上)了解您的计划执行的system calls。