Во-первых, отличный вопрос.:) Весь необходимый код хорошо сформулирован, и очевидно, что вы сделали свою работу.:)
Как вы запускаете свою программу в отладчике?Я думаю, что отправная точка argv[2]
может быть связана с не достижением printf()
, но это будет зависеть от того, как вы начинаете.Подробнее см. Ниже.
Несколько комментариев:
int size= 4096;
Как правило, макросы препроцессора C используются для такого магического числа.Я знаю, что ваши учителя, вероятно, говорили, что никогда не используют препроцессор, но идиоматический C будет читать:
#define SIZE 4096
for (i=2; i<argc; i++){ //get first file
Попробуйте i=1
- argv[0]
- это имяПрограмма, argv[1]
будет первым аргументом командной строки - предположительно, если кто-то вызывает его через ./wc foo
, вы хотите посчитать количество строк в файле foo
.:) (Кроме того, вы хотите, чтобы цикл завершился. :) Конечно, если вы пытаетесь написать замену для wc -l
, тогда ваш цикл в порядке, но не очень полезен, если кто-то облажает аргументы.Это можно безопасно сохранить как проект на будущее.(Если вам интересно, прочитайте справочную страницу getopt(3)
.:)
if ((fd=open(argv[i], O_RDONLY))!= -1){
while ((c= read(fd, buf, size))!= 0){
for (j=0; j<size; j++){
Вы заканчиваете цикл на j<size
- но вы читаете только c
символов в последнем блоке,Вы читаете остатки мусора в последнем блоке.(Я не удивлюсь, если в /proc/
будут сгенерированы файлы, которые могут возвращать короткие чтения из-за удобства для программистов ядра.)
if (buf[j] == '\n')
fileLines++;
}
}
}
printf("%s had %d lines of text\n", argv[i], fileLines);
totalLines+= fileLines;
Это первый раз, когда вы назначаете totalLines
.:) Может иметь начальное значение мусора.
close(fd);
Возможно, вам следует переместить вызов close(fd);
в блок if((fd=open()))
;если открытие не удалось, это вызовет close(-1);
.Ничего страшного, но если вы проверяете возврат ошибки close(2)
(всегда хорошая практика), она выдаст ненужную ошибку.
}
Надеюсь, это поможет!