我正在编写一个实用程序来通过 Unix 命令行计算给定文件中的行数。通常这对我来说很简单,但显然我有一个重要的休息之夜。该程序的目标是从命令行获取未知数量的文件,将它们读入缓冲区并检查换行符。听起来很简单?
int size= 4096;
int main(int argc, char *argv[]){
int fd, i, j, c, fileLines, totalLines;
char *buf= (char *)malloc(size); //read buffer
for (i=2; i<argc; i++){ //get first file
fileLines=1;
if ((fd=open(argv[i], O_RDONLY))!= -1){ //open, read, print file count, close
while ((c= read(fd, buf, size))!= 0){
for (j=0; j<size; j++){
if (buf[j] == '\n')
fileLines++;
}
}
}
printf("%s had %d lines of text\n", argv[i], fileLines);
totalLines+= fileLines;
close(fd);
}
printf("%d lines were counted overall\n", totalLines);
return 0;
}
我有两个问题。第一个是第一个 printf 语句永远不会在调试器之外执行。第二件事是totalLines打印输出大约应该是175K行,但是打印出来的值大约是767倍。
我无法理解这一点,因为所有相关变量都已被声明超出其修改的范围,但这仍然不能解释为什么在调试器之外忽略第一个打印语句和行计数器更新以及异常的 totalLines结果
任何帮助表示赞赏。
回答
提出了两项更改。
首先是更改j<size
为j<c
. 虽然这不是所需的解决方案,但它遵循良好的编码约定
第二个是更改i=2
为i=1
. 我拥有原始 start 变量的原因是我启动调试器可执行文件的方式。在gdb命令行中,我进入run lc1 f1.txt
启动调试器。这导致 arglist 具有三个变量,我不知道这run f1.txt
是否完全合适,因为我的教授通过使用第一个示例向我们介绍了 gdb。