gpt4 book ai didi

c - fseek() 和 ftell() 在循环中失败

转载 作者:行者123 更新时间:2023-11-30 16:47:12 25 4
gpt4 key购买 nike

我需要循环遍历目录data并读取字符串中满足特定条件的每个文件并对其执行某些操作。由于某种原因,它在 fseek 调用后失败(输出只是目录中第一个文件的名称)。

知道我做错了什么吗?

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>

void doAlgorithm(char *input) {
printf("%s\n", input);
}

int main(int argc, char** argv) {
struct dirent *dir;
DIR *d = opendir("data");
FILE *file;
while ((dir = readdir(d)) != NULL) {
if (strlen(dir->d_name) > 6 && dir->d_name[6] == 'i') {
printf("Filename: %s\n", dir->d_name);
file = fopen(dir->d_name, "r");
fseek(file, 0, SEEK_END);
long length = ftell(file);
fseek(file, 0, SEEK_SET);
printf(", Filesize: %ld\n", length);

char *buffer = malloc(length + 1);
fread(buffer, 1, length, file);
buffer[length] = '\0';

fclose(file);
doAlgorithm(buffer);
}
}
closedir(d);
return (EXIT_SUCCESS);
}

最佳答案

您的问题是您 file = fopen(dir->d_name, "r"); 不知道该文件在目录中的位置。你需要给它完整的路径。你可以这样做;

    struct dirent *dir;
// put the directory path here. on windows is \ instead of /
char *path = "/Users/adnis/CLion/Stackoverflow/testdir";
char *slash = "";
DIR *d = opendir(path);
FILE *file;
while ((dir = readdir(d)) != NULL) {
if (strlen(dir->d_name) > 6 && dir->d_name[6] == 'i') {
printf("Filename: %s\n", dir->d_name);
int length = strlen(path);
/*check if the path already contains a '/' at
the end before joining the filename to the directory*/

if(path[strlen(path)-1] != '/'){ //on windows is '\'
slash = "/";
}

length += strlen(dir->d_name)+2;
// allocate memory for the new path
// and make sure we have enough memory.
char *newpath = malloc(length);

assert(newpath != NULL);

snprintf(newpath,length,"%s%s%s",path,slash,dir->d_name);

file = fopen(newpath, "r");
if(file == NULL){
fprintf(stderr, "fopen: %s\n", strerror(errno));
break;
}
fseek(file, 0, SEEK_END);
long len = ftell(file);
fseek(file, SEEK_SET, 0);

char *buffer = malloc(len + 1);
fread(buffer, 1, len, file);
buffer[strlen(buffer)] = '\0';

printf("%s \n",buffer);
fclose(file);
}
}
closedir(d);
return (EXIT_SUCCESS);

我建议在阅读目录时你也必须尽量避免阅读“.”。和“..”,因为它们只是当前目录和上一个目录。这样的事情会有帮助。在你的 while 循环中

if(strcmp(dir->d_name,".") == 0 || strcmp(dir->d_name,"..") == 0)
continue;

关于c - fseek() 和 ftell() 在循环中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43412417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com