FSEEK()和FTELL()在一个循环中失败

问题描述:

我需要循环槽目录,data和读取每个文件,满足一定的条件下,在一个字符串,用它做什么。出于某种原因,它的fseek呼叫失败后(输出目录中的第一个文件的唯一名称)。FSEEK()和FTELL()在一个循环中失败

任何想法,我究竟做错了什么?

#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); 
} 
+0

'ftell'返回'long' int太小 –

+0

你也无法检查返回值到处都是。仅仅因为你要求“长度”字节并不意味着你拿到了它们。 – ShadowRanger

+0

确定我固定的,但它仍然不会改变任何东西,程序仍不能正常的FSEEK()调用后工作。顺便说一句,我在Windows上运行它,如果它很重要。 –

您的问题是,您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;