下面的代码应该按以下方式工作:打印目录中的文件列表,并打印每个.c文件的内容。
在UNIX中针对同一目录执行时,它工作正常:./a.out ./

但是,我无法使其在./a.out ../differentDir执行中起作用。

我知道,如果提供绝对路径作为参数,则可以使用argv [1]。但是,当它以相对路径的形式提供时,我会迷失。

#include <sys/types.h>

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

#define BUFFSIZE 32768

int main(int argc, char **argv) {

    char buf[BUFFSIZE];
    DIR *dp;
    struct dirent *dirp;
    char filename[80];
    int  name_length;
    FILE *fp;

    if (argc != 2) {
        fprintf(stderr, "usage: %s dir_name\n", argv[0]);
        exit(1);
    }

    if ((dp = opendir(argv[1])) == NULL ) {
        fprintf(stderr, "can't open '%s'\n", argv[1]);
        exit(1);
    }

        while ((dirp = readdir(dp)) != NULL ){
           printf("%s\n", dirp->d_name);
           memset(filename, '\0', sizeof(filename));
           strcpy(filename, dirp->d_name);
           printf(" ** %s ", filename);
           name_length = strlen(filename);
           printf(" name_length=%d \n", name_length);
            if (findC(filename)) // checking if the file has a .c extension
            {
                fp=fopen(filename, "r");
                if (fp == NULL)
                    fprintf(stderr, "Can't open .C file!\n");
                else
                    {// if the file was opened successfuly:
                        do
                        {
                           fgets(buf,BUFFSIZE,fp); // reading each line until buffer is full or until reaching whitespace
                           buf[strlen(buf)-1]='\0'; // removing the trailing whitespace from the buffer
                           puts(buf);
                        }
                        while (!feof(fp));
                    printf("\n\n");
                    fclose(fp);
                    }
            }
        }
    closedir(dp);
    return(0);
}

/*FindC method gets a c-string that represents a file name; returns 1 if the file ends with .C extension, else returns 0*/
int findC(char * name)
{
    int len = strlen(name);
    if (len>=2 && name[len-2]=='.' && tolower(name[len-1])=='c')
        return 1;
    return 0;
}

最佳答案

打开要读取的文件时,文件路径名也必须是相对的。

    // Form prefix for complete relative file name
    char filename[MAXPATH];
    strcpy(filename, argv[1]);
    // append '/' if directory path does not end in '/'
    if (TBD_code(filename)) {
      strcat(filename, "/");
    }
    char *end = filename[strlen(filename)];

    while ((dirp = readdir(dp)) != NULL ){
       printf("%s\n", dirp->d_name);
       if (findC(dirp->d_name)) {
         // append filename to prefix
         strcpy(end, dirp->d_name);
         fp=fopen(filename, "r");
         ...

09-30 16:46
查看更多