文件IO中read()函数读取输出字符串有乱码

更多资料请点击:我的目录
本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢。

问题如图,输出后(第三行)后面输出有乱码。原因是所定义的数组、函数参数(输入、输出字符串长度等)是用变量的,输入字符串中含有空格,通俗地说就是到了字符串末尾时,read()函数分不清这是个空格还是结束符,然后就跟着一串乱码出来,如果你的字符串没有空格的话,它是不会出现乱码的。
在这里插入图片描述
解决办法:
①在read()函数前加入一句:
buf_r[len] = '\0'; //给数组buf_r[]最后一位赋值为'\0'换行符,当read()函数读到'\0'时,就停止读取,就不会输出乱码。
②将所有用变量定义的参数,改为定值 ,比如:

char buf_r[100]={0};   		//变量 char buf_r[]={0};
size=read(fd,buf_r,100));	//变量 size=read(fd,buf_r,len));
size=read(fd,buf_r,100));	//变量 size=read(fd,buf_r,sizeof(buf_r))) ;

在这里插入图片描述
详细代码如下:

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



int main(void)

{

	int i,fd,size,len;

	char *buf="Hello! I'm jiajiage.";

	char buf_r[]={0};
	//char buf_r[100]={0};//改为定值

	len = strlen(buf);

/*******************open()********************************/

	if((fd=open("jiajia.c", O_CREAT | O_TRUNC | O_RDWR,0666))<0)  //创建打开jiajia.c文件(删除原有数据),文件可读可写

	{

		perror("open:");

		exit(1);

	}

	else

		printf("open file:jiajia.c %d\n",fd);//如果打开成功,返回值fd>0的文件描述符,也就是jiajia.c编号

/*******************write()*********************************/

	if((size=write(fd,buf,len))<0)  //把buf字符串通过fd描述符写入jiajia.c中,写入的长度为字符串的长度。

	{

		perror("write:");

		exit(1);

	}

	else

		printf("Write:%s\n",buf);

/******************lseek()*********************************/

	lseek( fd, 0, SEEK_SET );//通过write(fd,buf,len)函数之后,fd的指针偏移量直接指向写入的最后一个字符。现通过lseek()函数,根据参数重新把fd偏移量移到0位置(开头位置)

/*******************resd()*********************************/

	buf_r[len] = '\0';//给数组buf_r[]最后一位赋值为'\0'换行符,当read()函数读到'\0'时,就停止读取。
	if((size=read(fd,buf_r,len))<0) //通过fd描述符把jiajia.c的字符串(write()函数写入的字符串)读取出来,然后把读取出来的字符串(小于10个字符)存放在r_buf字符串中。

	{

		perror("read:");

		exit(1);

	}

	else

		printf("read form file:%s\n",buf_r);

/********************close()********************************/

	if(close(fd)<0)   //关闭打开jiajia.c函数

	{

		perror("close:");

		exit(1);

	}

	else

		printf("Close jiajia.c\n");

/**********************退出函数******************************/

	exit(0);//退出

	//return 0;

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章