#c
Вопрос:
else if (S_ISDIR(file.st_mode)) { //if is directory
dir = opendir(argv[2]);
if (dir == NULL) { //if invalid directory
perror("Not a valid directory");
closedir (dir);
free(newFile);
free(filePath);
exit(EXIT_FAILURE);
}
while ((dent = readdir(dir)) != NULL) { //loop through each file
if(dent->d_name[0]!='.' amp;amp; strncmp(dent->d_name, "wrap.", 5)!=0){ //if file doesn't start with '.' or "wrap."
filePath = (char *) realloc(filePath, strlen(dent->d_name) strlen(argv[2]) 1);
strncat(filePath, argv[2], strlen(argv[2])); //add directory path to file path
strncat(filePath, "/", 1); // add slash
strncat(filePath, dent->d_name, strlen(dent->d_name)); //add filename
fileInputDescriptor = open(filePath,O_RDONLY);
newFile = (char *) realloc(newFile, strlen(argv[2]) strlen(dent->d_name) 6); //newFile is name of new file
strncat(newFile, argv[2], strlen(argv[2])); //add directory path to newFile
strncat(newFile, "/wrap.", 6); //add /wrap.
strncat(newFile, dent->d_name, strlen(dent->d_name)); //add file name to end
fileOutputDescriptor = open(newFile, O_RDWR|O_CREAT, 0666); //create file
wrap(width, fileInputDescriptor, fileOutputDescriptor);
*newFile = '';
*filePath = '';
close(fileInputDescriptor);
close(fileOutputDescriptor);
}
}
closedir(dir); //close directory
}
Я пишу программу, которая возьмет все файлы в каталоге и создаст новую «завернутую» версию файла в том же каталоге, где текст в файле отформатирован по-другому. Код работает, но я получаю сообщение об ошибке «дважды свободен или поврежден (!до)». Прервано». Я узнал, что это происходит, когда вызывается closedir (), но я не могу понять, почему.
Комментарии:
1. Ваши
relloc
» с » закончились к часу. Вы забываете о нулевом терминаторе2. использование
strlen
в качестве аргумента длины противоречит целиstrncat
. Кроме того, эти последовательные объединения являются хрестоматийным примером алгоритма Шлемиэля Художника.3. Не звони
closedir(dir)
, когдаopendir()
вернетсяNULL
.4. Вместо множества
strncat()
вызовов используйтеsprintf()
для форматирования имени пути все сразу.5. Если кто-то сказал вам, что
strncat()
это «безопаснее», вы неправильно поняли, как безопасно его использовать. Длина должна быть размером пространства, доступного в пункте назначения, а не длиной источника. Цель состоит в том, чтобы убедиться, что вы не пишете за рамками.