文件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;

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