在Linux下通过read读文件出现的问题

沉默的牧羊者 2017-04-08 11:18:58

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>

#define infile "temp.dat"
#define outfile "outfile.dat"
#define length 20

void translation()
{
int creatf;
int infd, outfd;
char buf[50];

if ((creatf = open(infile, O_WRONLY | O_TRUNC | O_CREAT, 10700)) == -1)
{
printf("ERROR, OPEN READ FILE FAILED: \n", sys_errlist[errno]);
exit(255);
}
else
{
printf("Create Successful\n");
}

strcpy(buf, "Hello");
if (write(creatf, buf, strlen(buf)) != strlen(buf))

{
printf("ERROR, WRITE FILE FAILED: \n", sys_errlist[errno]);
exit(255);
}
else
{
printf("Write Successful\n");
}


close(creatf);

if (infd = open(infile, O_RDONLY)==-1)
{
printf("ERROR, OPEN READ FILE FAILED: \n", sys_errlist[errno]);
exit(255);
}
else
{
printf("INFILE Open Success\n");
}

if (outfd = open(outfile, O_WRONLY | O_TRUNC | O_CREAT, 10700)==-1)
{
printf("ERROR, OPEN WRITE FILE FAILED: \n", sys_errlist[errno]);
exit(255);
}
else
{
printf("OUTFILE Open Success\n");
}

int count;

while((count = read(infd, buf, sizeof(buf))) > 0) //在这一行就出现程序就停下来了
{
if (write(outfd, buf, count) != count)
{
printf("ERROR, WRITE FILE FAILED: \n", sys_errlist[errno]);
exit(255);
}
else
{
printf("%s", buf);
}
}
close(infd);
close(outfd);
}

void main()
{
translation();
}



在读文件时,程序就停止了,我按回车后才继续显示下一步,但是和预想中的不一样!




上图表示在此处停住了



上图表示停住后,按下回车键时,断断续续的出现的东西(文件里面只写了"Hello")


我想问一下问题到底出在了什么地方??
...全文
469 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
沉默的牧羊者 2017-04-10
  • 打赏
  • 举报
回复
引用 3 楼 tjroamer 的回复:
你的程序的问题是if语句错误。你的if语句首先判断open返回的值是不是-1,然后把比较的值赋给变量。但是你的程序意图是先把open返回的值赋给变量,然后和-1进行比较。所以要先用括号把赋值操作引用起来。
也就是说,程序首先是将open函数的返回值和-1作比较,发现不相等,则比较的结果(即0)将返回给fd,然后程序就将从stdin处读取信息了,这样理解吗?? 其实也就是我没有搞清运算符的优先级。 非常感谢。
tjroamer 2017-04-10
  • 打赏
  • 举报
回复
你的程序的问题是if语句错误。你的if语句首先判断open返回的值是不是-1,然后把比较的值赋给变量。但是你的程序意图是先把open返回的值赋给变量,然后和-1进行比较。所以要先用括号把赋值操作引用起来。
沉默的牧羊者 2017-04-09
  • 打赏
  • 举报
回复
引用 1 楼 tjroamer 的回复:
问题出在第45行和第55行。 第45行应该是:
if ((infd = open(infile, O_RDONLY))==-1)
第55行应该是:
if ((outfd = open(outfile, O_WRONLY | O_TRUNC | O_CREAT, 10700))==-1)
你的程序infd和outfd都是0,那么read函数会从stdin读取输入,你输入enter,那么read把换行符放入buf的第一个位置,从而替换了第一个字符H,所以打印出来的是一个换行符加上以前buf里面的index从1开始的值,直到\0。所以你看到ello。
“infd和outfd都是0,那么read函数会从stdin读取输入”,可是infd和outfd等于0不是表示欲核查的权限都通过了吗??按理说是应该正常打开文件的啊??
tjroamer 2017-04-09
  • 打赏
  • 举报
回复
问题出在第45行和第55行。 第45行应该是:
if ((infd = open(infile, O_RDONLY))==-1)
第55行应该是:
if ((outfd = open(outfile, O_WRONLY | O_TRUNC | O_CREAT, 10700))==-1)
你的程序infd和outfd都是0,那么read函数会从stdin读取输入,你输入enter,那么read把换行符放入buf的第一个位置,从而替换了第一个字符H,所以打印出来的是一个换行符加上以前buf里面的index从1开始的值,直到\0。所以你看到ello。

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧