更多資料請點擊:我的目錄
本篇僅用於記錄自己所學知識及應用,代碼仍可優化,僅供參考,如果發現有錯誤的地方,儘管留言於我,謝謝。
問題如圖,輸出後(第三行)後面輸出有亂碼。原因是所定義的數組、函數參數(輸入、輸出字符串長度等)是用變量的,輸入字符串中含有空格,通俗地說就是到了字符串末尾時,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;
}