我一直在我的桌子上撞了几个小时,试图弄清楚为什么以下代码在while(chars = read(fd, buff, BUFF_SZ)) > 0)
停滞不前。直接跟随的行上的printf
未被调用,而正上方的0
是。文件描述符返回char *infile = argv[1];
int fd,chars;
if ((fd = open(infile, O_RDONLY) < 0)) {
perror("open()");
exit(1);
}
printf("%s - opened (fp: %d)\n", infile, fd);
while((chars = read(fd, buff, BUFF_SZ)) > 0){
printf("%d\n", chars);
for(i = 0; i < chars; i++){
c = buff[i];
total++;
count[c]++;
}
}
,这是一个有效值。
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#define BUFF_SZ 4096
int main(int argc, char *argv[])
{
if(argc != 2)
perror("Wrong number of arguments!");
int fd;
char *infile = argv[1];
char buff[BUFF_SZ];
int chars,c,c2,i;
long long total = 0;
long long count[256];
char line[71];
printf("zeroing count[]\n");
for (c = 0; c < 256; c++) {
count[c] = 0;
}
if ((fd = open(infile, O_RDONLY) < 0)) {
perror("open()");
exit(1);
}
printf("%s - opened (fp: %d)\n", infile, fd);
while((chars = read(fd, buff, BUFF_SZ)) > 0){
printf("%d\n", chars);
for(i = 0; i < chars; i++){
c = buff[i];
total++;
count[c]++;
}
}
close(fd);
printf("%s closed\n", infile);
if(chars < 0){
perror("read()");
}
printf("outputting results\n");
for (c = 0;c < 256; c++) {
printf("\t%d of 256\n", c+1);
snprintf(line, 70, "%.70lf\n",
((float)count[c] / (float)total));
for (c2 = 68; c2; c2--) {
if (line[c2] != '0'
&& line[c2] != '.')
break;
}
line[++c2] = 0;
printf("%s\n", line);
}
return 0;
}
我甚至不知道如何调试这个,因为在该行之后没有触发任何内容,并且在此行之前一切正常。
完整的,可编辑的代码:
{{1}}
答案 0 :(得分:6)
问题是您对fd
的分配。
if ((fd = open(infile, O_RDONLY) < 0)) {
应该是:
if ((fd = open(infile, O_RDONLY)) < 0) {
线索是当你说fd
为0时。这是不太可能的,因为fd 0是stdin,除非你在打开infile之前关闭stdin,否则不会发生这种情况。
您正在为fd
分配将open
的返回值与0进行比较的结果,而不是分配返回值本身。
答案 1 :(得分:1)
您只需要重新排列括号
if ((fd = open(argv[1], O_RDONLY)) < 0) {