LINUX讀寫文件


讀寫文件

讀寫文件的函數原型為:

#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  0STDOUT_FILENO 1STDERR_FILENO 2

writeSTDOUT_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_FILENOSTDOUT_FILENOSTDERR_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;
}




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM