Как читать имена файлов в каталоге и подсчитывать слова и строки

#c #file

Вопрос:

Здравствуйте, я должен перечислить файлы в каталоге, и для каждого файла я бы подсчитал количество слов и строк. Проблема заключается в открытии файла, потому что указатель на файл всегда равен НУЛЮ. файлы находятся в этой папке: myfolder, программа тоже.

Программа запускается отсюда: otherthings/myfolder/readfiletest.c

 int main(void)
{
    int word_count = 0, line_count = 0,in_word = 0;
    char ch;
    DIR *d;
    FILE *fp;
    char path[2100];
    struct dirent *dir;
    d = opendir("myfolder");
    if (d)
    {
        while ((dir = readdir(d)) != NULL)
        {
            printf("%sn", dir->d_name);
            
            strcpy(path,"myfolder");
            strcat(path,"/");
            strcat(path,dir->d_name);
            fp = fopen(path, "r");
            int i =0;
            /*while(path[i]){
                printf("%c",path[i]);
                i  ;
            }*/
            if(fp == NULL) {
                 perror("Could not open the file");
                }
             while ((ch = fgetc(fp)) != EOF) {
                if(ch == ' ' || ch == 't' || ch == '' || ch == 'n') {
                    if (in_word) {
                    in_word = 0;
                    word_count  ;
                }

            if(ch = '' || ch == 'n') line_count  ;

            } else {
                in_word = 1;
             }
             fclose(fp);
    }

        }
        printf("Number of words: %d.n", word_count);
        printf("Number of lines: %d.n", line_count);
        closedir(d);
    }
    return(0);
}
 

Полученный код, мой вывод:
mytext.txt
..
.
Ошибка сегментации ( я не могу сообщить об исключении, потому что я работаю в контейнере, содержащем среду для OpenMPI, поэтому ошибка заключается в том, что mpirun заметил, что процесс ранга 0 с PID 0 на узле 979208abf4bc вышел по сигналу 11 (ошибка сегментации)
).

Комментарии:

1. "myfolder" кажется, что он находится на видимом пути , так будет ли там один файл "myfolder/mytext.txt" , нет "mytext.txt" ?

2. поэтому я должен открыть в read myfolder/mytext.txt? @Флюгер

3. Это будет означать следующее: попробуйте создать имя из папки и имени файла.

4. Не будучи педантичным, но вам это нужно #include <stdio.h> , и string.h , возможно, некоторым другим тоже. Не заставляй нас предполагать что-то одно.

5. Пожалуйста, задайте еще один вопрос. Этот сайт не является постоянным местом «исправь мой код»!

Ответ №1:

Это ваша while петля

         while ((ch = fgetc(fp)) != EOF) {
            if(ch == ' ' || ch == 't' || ch == '' || ch == 'n') {
                if (in_word) {
                in_word = 0;
                word_count  ;
            }

        if(ch = '' || ch == 'n') line_count  ;

        } else {
            in_word = 1;
        }
        fclose(fp);
}
 

с fclose(fp); внутренним циклом, который считывает из него. При форматировании ваш код будет

 while ((ch = fgetc(fp)) != EOF) {
    if(ch == ' ' || ch == 't' || ch == '' || ch == 'n') {
        if (in_word) {
            in_word = 0;
            word_count  ;
        }

        if(ch = '' || ch == 'n')
            line_count  ;

    } else {
        in_word = 1;
    }
    fclose(fp);
}
 

Теперь вы можете видеть, что fclose(fp); это нужно убрать из цикла.

Комментарии:

1. Даже если для обычных текстовых файлов значение ch никогда не будет равно нулю, ch = '' это подозрительно. То есть в последнем блоке кода в вашем ответе. Мне было бы грустно, если бы кто-то скопировал этот код, не задумываясь обо всех «прокатных» проблемах.