linux下的read和write的问题,求助!

jdwq33 2013-02-20 02:25:27

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

int main(int argc, char** argv)
{
int fd, fd_b;
int ret = 0;
char buffer[128];

if((fd = open("snake.c", O_RDONLY),0666) < 0)
{
printf("First file open fail!\n");
exit(-1);
}
if((fd_b = open("test_new.c", O_CREAT | O_WRONLY | O_TRUNC), 0666) < 0)
{
printf("Second file open fail!\n");
exit(-1);
}
//运行完后为什么test_new.c文件总是比原文件多几行呢??非常不理解!
while(1)
{

if((ret = read(fd, buffer, sizeof(buffer) - 1)) < 0)
{
printf("read fail!\n");
exit(-1);
}

if(write(fd_b, buffer, strlen(buffer) - 1) < 0)
{
printf("write fail!\n");
exit(-1);
}
//这个地方是如果读取完了,返回读的数小于buffer那么就应该退出。
if(ret < (sizeof(buffer))-1)
{
break;
}

}
printf("buffer = %s\n", buffer);

close(fd);
close(fd_b);

return 0;
}


这个小程序是在linux下编辑的,谢谢大师帮忙解答!!
...全文
458 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
jdwq33 2013-02-28
  • 打赏
  • 举报
回复

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

int main(int argc, char** argv)
{
	int fd, fd_b;
	int ret = 0;
	char buffer[128];

	if((fd = open("snake.c", O_RDONLY)) < 0)
	{
		printf("First file open fail!\n");
		exit(-1);
	}
	if((fd_b = open("test_new.c", O_CREAT | O_WRONLY | O_TRUNC, 0666)) < 0)
	{
		printf("Second file open fail!\n");
		exit(-1);
	}

	while(1)
	{

		if((ret = read(fd, buffer, sizeof(buffer) - 1)) < 0)
		{
			printf("read fail!\n");
			exit(-1);
		}
                 //这样就不会多出来那些不想要的行数了
                buffer[ret] = '\0';
		if(write(fd_b, buffer, strlen(buffer) - 1) < 0)
		{
			printf("write fail!\n");
			exit(-1);
		}
              //这个地方是如果读取完了,返回读的数小于buffer那么就退出。
		if(ret < (sizeof(buffer))-1)
		{
			break;
		}

	}

	close(fd);
	close(fd_b);

	return 0;
}
truno 2013-02-26
  • 打赏
  • 举报
回复
#include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <string.h> #include <fcntl.h> #include <unistd.h> int main(int argc, char** argv) { int fd, fd_b; int ret = 0; char buffer[128]; if((fd = open("snake.c", O_RDONLY),0666) < 0) { printf("First file open fail!\n"); exit(-1); } if((fd_b = open("test_new.c", O_CREAT | O_WRONLY | O_TRUNC), 0666) < 0) { printf("Second file open fail!\n"); exit(-1); } /*运行完后为什么test_new.c文件总是比原文件多几行呢??非常不理解!*/ while(1) { memset(buffer, 0x00, sizeof(buffer)); if((ret = read(fd, buffer, sizeof(buffer) - 1)) < 0) { printf("read fail!\n"); exit(-1); } /*if(write(fd_b, buffer, strlen(buffer) - 1) < 0)*/ if(write(fd_b, buffer, ret) < 0) { printf("write fail!\n"); exit(-1); } /*这个地方是如果读取完了,返回读的数小于buffer那么就应该退出。*/ if(ret < (sizeof(buffer))-1) { break; } } /*printf("buffer = %s\n", buffer);*/ close(fd); close(fd_b); return 0; }
jdwq33 2013-02-26
  • 打赏
  • 举报
回复
引用 23 楼 zhao4zhong1 的回复:
“给定开始地址和字节总数的一段字节”和“给定开始地址和结尾'\0'字符的一个字符串”不是一回事!
弄好了,我就是犯了赵老师说的错误!
赵4老师 2013-02-21
  • 打赏
  • 举报
回复
“给定开始地址和字节总数的一段字节”和“给定开始地址和结尾'\0'字符的一个字符串”不是一回事!
wangzhang_123 2013-02-21
  • 打赏
  • 举报
回复
学习下,感谢了
mymtom 2013-02-21
  • 打赏
  • 举报
回复
引用 2 楼 jdwq33 的回复:
引用 1 楼 mymtom 的回复:if(write(fd_b, buffer, strlen(buffer) - 1) < 0) 改为 if(write(fd_b, buffer, ret) < 0) 我试过了,但是我这边的运行过来后的.C文件每行的最后多个^M,其他的.c源文件却不是这样,为什么呢? 能帮忙解释一下,为什么要改成ret呢???谢谢!! ……
ret是读出的字节数啊,从输入文件读到多少字节,就写入多少字节啊。
jdwq33 2013-02-20
  • 打赏
  • 举报
回复
引用 17 楼 Michael_g 的回复:
把你改的代码粘出来
不懂是什么意思?呵呵!
卦星 2013-02-20
  • 打赏
  • 举报
回复
使用memset将buffer设置一下
lvjing_CSDN 2013-02-20
  • 打赏
  • 举报
回复
引用 9 楼 jdwq33 的回复:
Quote: 引用 5 楼 lvjing_CSDN 的回复: 怎么觉得你写的怪怪的,我改了下,你看看可行: quote] 你好,这样是可以的,能帮忙解释一下吗?谢谢,呵呵!!!
额,我只是在你的基础上简单了改了下,我也不知道解释什么。
Michael_g 2013-02-20
  • 打赏
  • 举报
回复
把你改的代码粘出来
Michael_g 2013-02-20
  • 打赏
  • 举报
回复
把你改的代码粘出为
jdwq33 2013-02-20
  • 打赏
  • 举报
回复
引用 12 楼 Michael_g 的回复:
你的代码根本源因就是你没有初始化buffer数据,导到strlen计算字符长度时出错。 你应该用read的返回值(读取的字节长度)做为write的数据长度。
那我初始化过后,用write(fd_b, buffer, strlen(buffer)),这样怎么还是不行呢?非得用ret吗?
jdwq33 2013-02-20
  • 打赏
  • 举报
回复
引用 12 楼 Michael_g 的回复:
你的代码根本源因就是你没有初始化buffer数据,导到strlen计算字符长度时出错。 你应该用read的返回值(读取的字节长度)做为write的数据长度。
嗯 非常认同 呵呵 谢谢啊
jdwq33 2013-02-20
  • 打赏
  • 举报
回复
引用 10 楼 zhoujiawen 的回复:
为啥非要用read wirte,一般来说,read/write主要是硬件的流文件。像串口等等 fwrite为文件的,我个人是这样认为的
写网络编程需要用到啊,呵呵。
Michael_g 2013-02-20
  • 打赏
  • 举报
回复
你的代码根本源因就是你没有初始化buffer数据,导到strlen计算字符长度时出错。 你应该用read的返回值(读取的字节长度)做为write的数据长度。
Michael_g 2013-02-20
  • 打赏
  • 举报
回复
你的代码根本源因就是你同有初始化buffer数据,导到strlen,计算字符长度时出错。
zhoujiawen 2013-02-20
  • 打赏
  • 举报
回复
为啥非要用read wirte,一般来说,read/write主要是硬件的流文件。像串口等等 fwrite为文件的,我个人是这样认为的
jdwq33 2013-02-20
  • 打赏
  • 举报
回复
[quote=引用 5 楼 lvjing_CSDN 的回复:] 怎么觉得你写的怪怪的,我改了下,你看看可行: quote] 你好,这样是可以的,能帮忙解释一下吗?谢谢,呵呵!!!
Michael_g 2013-02-20
  • 打赏
  • 举报
回复
sizeof(buffer) - 1)) 这个比实际的长度少一个字节,我想你本意是用来保存结尾0的吧。 但你最后一个字节永远是不会被覆盖的,你又没有初始化它,它当可能不是0了。
jdwq33 2013-02-20
  • 打赏
  • 举报
回复
引用 4 楼 zhoujiawen 的回复:
试试这样 (我是用来操作文本文件的) fseek(fp, info->newhisaddr, SEEK_SET); fwrite(tmpevent, 1, HIS_LENGTH, fp); fseek(fp, info->newhisaddr, SEEK_SET); fread(&temp2, HIS_LENGTH, 1, fp);
因为要用write和read来写,文本文件可以的,我试过,呵呵!
加载更多回复(6)

69,381

社区成员

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

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