#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 = ''
это подозрительно. То есть в последнем блоке кода в вашем ответе. Мне было бы грустно, если бы кто-то скопировал этот код, не задумываясь обо всех «прокатных» проблемах.