没有使用gcc -Wall -W -g3< inputfile.c >编译警告 但是二进制文件没有显示任何内容而且没有获得$ prompt。 gcc版本4.9.2(Ubuntu 4.9.2-10ubuntu13)。我是从Keith Haviland的“Unix系统编程”一书中读到的。 read()调用的示例。
~/.ssh/config
我无法理解gdb显示的内容。 fi.txt只包含一个单词,Hello。
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
#define BUFSIZE 512
int main()
{
char buffer[BUFSIZE];
int fd;
ssize_t nread;
long total = 0;
if( (fd = open("fi.txt", O_RDONLY) == -1)){
printf("error in opening file\n");
exit(1);
}
while( (nread = read(fd, buffer, BUFSIZE))>0)
total += nread;
printf("Total characters: %ld\n", total);
exit(0);
}
它继续打印类似的消息。
答案 0 :(得分:3)
你在这里放错了括号:
rem
导致fd被设置为0,而不是open的返回值。因此,您实际上是从fd 0(STDIN)读取。
应该是:
if( (fd = open("fi.txt", O_RDONLY) == -1)){
答案 1 :(得分:1)
我认为你只是犯了一个低级错误:
更改此行代码:
if( (fd = open("fi.txt", O_RDONLY) == -1)){
到
if( (fd = open("fi.txt", O_RDONLY)) == -1){
然后你会得到正确的结果。
因为你的代码会使fd = 0,而0是stdin,所以progrm总是等你的输入。
答案 2 :(得分:0)
[评论太长了:]
参考最佳实践调试:如果看似简单的代码失败,请寻找隐藏的不必要的复杂但必要的构造并将它们分开。在你展示的情况下,有两个这样的结构:
打开文件:
if ((fd = open("fi.txt", O_RDONLY) == -1))
{
perror("open() failed");
...
这可以写成:
fd = open("fi.txt", O_RDONLY);
if (fd == -1)
{
perror("open() failed");
...
从文件中读取:
while ((nread = read(fd, buffer, BUFSIZE)) > 0)
可写:
nread = read(fd, buffer, BUFSIZE);
while(nread > 0)
{
...
nread = read(fd, buffer, BUFSIZE);
}
if (nread == -1) /* Add as much error checking as possible. */
{
perror("read() failed)");
}
或者更多只使用一次调用read()
,但分离错误处理,以这种方式增加if
的费用:< / p>
do
{
nread = read(fd, buffer, BUFSIZE);
if (nread == -1) /* Add as much error checking as possible. */
{
perror("read() failed)");
}
else
{
...
}
} while (nread > 0);