|
讀寫文件
讀寫文件的函數原型為:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count); //文件描述詞 緩沖區 長度
ssize_t write(
int fd
, const void *buf, size_t count);
off_t lseek(int fd, off_t offset, int whence);
//用法和fseek一樣,只不過第一個形參傳遞的是fd
對於 read 和 write 函數,出錯返回-1,讀取完了之后,返回0, 其他情況返回讀寫的個數。
|
| //rwfile.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<fcntl.h>
int main(int argc,char **argv)
{
if( 3!=argc )
{
fputs("error args\n",stderr);
return -1;
}
char buf[128]="hello world\n";
int fdw = open(argv[1],O_CREAT|O_WRONLY,0666);
if( -1==fdw )
{
fputs("error open\n",stderr); //perror(open);
return -1;
}
printf("fdw =%d\n",fdw);
int ret = write(fdw,buf,strlen(buf)); //sizeof(buf)沒字符的地方會寫入其他字符
if( 0>=ret )
{
perror("write");
return -1;
}
printf("write ret=%d\n",ret);
int fdr = open(argv[2],O_CREAT|O_RDONLY,0666);
if( -1==fdr )
{
fputs("error open\n",stderr); //perror(open);
return -1;
}
printf("fdr =%d\n",fdr);
bzero(buf,0);
ret = read(fdr,buf,sizeof(buf));
printf("read ret=%d\n",ret);
close(fdw);
close(fdr);
}
|
![]() //如果后面不從新的文件中讀取數據,那么 fdr 就是3。 //追加內容寫入文件會自動換行 |
O_APPEND 不管光標在哪 都在文件末尾添加
*******為了每次少寫頭文件,可以vim head.h 里面存放所有要用到的頭文件,最后在.c文件中引用,系統會自己去找頭文件;vim func.h 存放頭文件 vim main.c 中 #include "func.h" 編譯.h自動找
宏定義: 標准輸入描述符, 標准輸出, 標准錯誤輸出
STDIN_FILENO 0,STDOUT_FILENO 1,STDERR_FILENO 2
write(STDOUT_FILENO,"error args\n",11); 等價於
printf("error args\n");
| func.h | rw_struct.c |
|
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<fcntl.h>
#include<strings.h>
#include<stdio.h>
//在文件里面寫入結構體,能正常寫入,但是查看是亂碼
fwrite()
能夠正常寫入
|
#include"head.h"
typedef struct student
{
int num;
char name[20];
float score;
}stu,pstu;
int main(int argc, char **argv)
{
//stu s[2]={{100,"meihao",89.23},{101,"xiaomei",34.23}};
stu s[2]={100,"meihao",89.23,101,"xiaomei",34.23};
printf("%5d %10s %5.2f\n",s[0].num,s[0].name,s[0].score);
printf("%5d %10s %5.2f\n",s[1].num,s[1].name,s[1].score);
int fdw = open(argv[1],O_RDWR|O_CREAT,0666);
write(fdw,&s[1],sizeof(stu));
lseek(fdw,0,SEEK_SET);
stu tmp;
int ret = read(fdw,&tmp,sizeof(stu));
printf("%5d %10s %5.2f\n",tmp.num,tmp.name,tmp.score);
close(fdw);
return 0;
}
|
|
標准輸入輸出文件描述符(區別於文件指針)
與標准的輸入輸出流對應,在更底層的實現是用標准輸入、標准輸出、標准錯誤文件描述符表示的。它們分別用STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO三個宏表示,值分別是0、1、2三個整型數字。
標准輸入文件描述符 STDIN_FILENO 0
標准輸出文件描述符 STDOUT_FILENO 1
標准錯誤輸出文件描述符 STDERR_FILENO 2
|
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
char szBuf[32],szBuf2[50];
printf("Input string:");
fflush(stdout); //要刷新標准輸出流,才可以立即在屏幕上顯示”Input string”
//fflush用於linux中的時候,只對fflush(stdout)有效。
int iRet = read(STDIN_FILENO,szBuf,sizeof(szBuf));
szBuf[iRet]=0; //read是以無類型指針方式讀的數據,不會自動在緩沖區后加0結束標記。
sprintf(szBuf2,"The string is:%s",szBuf);
write(STDOUT_FILENO,szBuf2,strlen(szBuf2));
return 0;
}
|

