【发布时间】:2012-01-11 19:37:30
【问题描述】:
这里是新手!
我下面的程序试图在 Linux 中表现得像(一点点)cat 命令。
如果没有提供参数,那么它会从用户那里获取输入并在屏幕上打印。(对于一个非常简单的场景,输入缓冲区假定为 10)..
如果我传递多个参数它正在工作..即它按照程序一一显示不同文件的内容..
--现在的重点是,当我在 shell 上发出命令时:
./mycat abc.txt > 测试
mycat 是我的程序名称,abc.txt 是所需文件,我将其重定向到新文件测试。
我无法理解的奇怪部分是,在重定向之后,如果我查看文件测试,它首先显示来自文件 abc.txt 的数据,然后是我在 c 程序中的 printf 函数,而不是显示 printfs,然后是数据。这是什么原因?
int main(int argc,char *argv[])
{
char buf[10];
int x,read_bytes,i,fd;
read_bytes=1;
char read_buf[1024*1024];
for(i=0;i<argc;i++)
printf("you entered %s\n",argv[i]); //this printf
switch(argc)
{
case 1:
x=read(0,buf,sizeof(buf));
write(1,buf,x);
break;
default:
for(i=1;i<argc;i++)
{
printf("showing the %dth file\n\n",i);
fd=open(argv[i], O_RDONLY);
if(fd==-1)
{
perror("no file opened for such name");
exit(1);
}
while(read_bytes!=0)
{
read_bytes=read(fd,read_buf,sizeof(read_buf));
if(read_bytes==-1)
{
perror("not able to read\n");
exit(2);
}
write(1,read_buf,read_bytes);
}
read_bytes=1;
close(fd);
}
break;
}
return 0;
}
【问题讨论】:
-
有什么理由使用 Posix
read/write而不是更便携和易于消化的标准 Cfread/fwrite? -
你应该尽量减少缩进的创意。
-
为什么“没有为这样的名称打开文件”?这是一个特别无用的错误消息。只需执行 perror(argv[ i ]) 并告诉用户哪个文件有问题。
-
@kerrek SB-实际上我想知道“原始”和“缓冲”输入输出机制,不同函数或系统调用所花费的时间,...
-
@saurabh:哦,好的。你注意到有什么不同吗?在进行比较之前,请确保使用最大优化进行编译。