C語言文件讀寫方法

[TOC]

fwrite

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

  • ptr:指向保存數(shù)據(jù)的指針;
  • size:每個(gè)數(shù)據(jù)類型的大小
  • count:數(shù)據(jù)的個(gè)數(shù)
  • stream:文件指針
  • return 函數(shù)返回寫入數(shù)據(jù)的個(gè)數(shù)
int write(const char *path) {
    FILE *file = fopen(path, "wb");
    if (file == NULL) {
        return 0;
    }
    int arr[4] = {0x00000012, 0x00001234, 0x00123456, 0x12345678};
    for (int i = 0; i < 4; i++) {
        fwrite(&arr[i], sizeof(int), 1, file);
    }
    fclose(file);
    return 1;
}

查看輸出的文件,看到數(shù)據(jù)的存儲(chǔ)是小端對(duì)齊


1.png

w wb的區(qū)別

wb 打開或新建一個(gè)二進(jìn)制文件,在POSIX系統(tǒng),包括Linux都會(huì)忽略該字符。windows文本文件打開時(shí)寫入\n,會(huì)自動(dòng)加上\r變成\r\n。而已二進(jìn)制方式打開則不會(huì)加上\r。

int write(const char *path) {
    FILE *file = fopen(path, "wb+");
//    FILE *file = fopen(path, "w");
    if (file == NULL) {
        return 0;
    }
    char *p = "abc\n1234";
    int len = fwrite(p, sizeof(char), strlen(p), file);
    printf("write len=%d\n", len);
    fclose(file);
    return 1;
}

使用wb+時(shí)候結(jié)果為:

write len=8
-------------
abc
12341234
read  length=8

使用w打開時(shí),結(jié)果為:

write len=8
-------------
abc
1234123
read  length=9

fread

int read(const char *path) {
    FILE *file = fopen(path, "rb");
    if (file == NULL) {
        return 0;
    }
    int len = 0;
    int total = 0;
    char buf[5] = {0};
    while (!feof(file)) {
        len = fread(buf, sizeof(char), 4, file);
        printf("%s", buf, len);
        total += len;
    }
    printf("\nread  length=%d", total);
    fclose(file);
    return 1;
}

注意:fread返回成功有效的讀取的item元素的個(gè)數(shù)。

這里修改寫下代碼:

#include <stdio.h>
#include <mem.h>

char *PATH1 = "D:\\code\\CProject\\FileByte\\1";

int read(const char *);

int write(const char *);

int main() {
    write(PATH1);
    printf("-------------\n");
    read(PATH1);
    return 0;
}

int write(const char *path) {
//    FILE *file = fopen(path, "wb+");
    FILE *file = fopen(path, "w");
    if (file == NULL) {
        return 0;
    }
    char *p = "abc\n1234";
    int len = fwrite(p, sizeof(char), strlen(p), file);
    printf("write len=%d\n", len);
    fclose(file);
    return 1;
}

int read(const char *path) {
    FILE *file = fopen(path, "rb");
    if (file == NULL) {
        return 0;
    }
    int len = 0;
    int total = 0;
    //使用short
    short buf[20] = {0};
    while (!feof(file)) {
        len = fread(buf, sizeof(short), 20, file);
        for (int i = 0; i < len + 2; i++) {
            printf("%x-", buf[i]);
        }
        total += len;
    }
    printf("\nread  length=%d", total);
    fclose(file);
    return 1;
}

結(jié)果為:

write len=8
-------------
6261-d63-310a-3332-34-0-
read  length=4

總共9個(gè)字節(jié),而實(shí)際有效讀入了4個(gè)short。


2.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 簡(jiǎn)介 C/C++中可以使用以fopen、fclose為代表的文件操作函數(shù)對(duì)文件進(jìn)行讀寫。 注:本文在Linux平臺(tái)...
    decoding閱讀 601評(píng)論 0 1
  • ^函數(shù)重載的匹配: 當(dāng)函數(shù)名被重載后,函數(shù)的匹配過程:首先尋找能精確匹配的函數(shù),如果未能精確匹配,則嘗試...
    魯大帥閱讀 1,142評(píng)論 0 1
  • Linux(C/C++)下的文件操作open、fopen與freopen open是linux下的底層系統(tǒng)調(diào)用函數(shù)...
    木兮or涼城閱讀 5,025評(píng)論 0 1
  • 文件操作 (Linux文件操作)) [文件|目錄] Linux文件操作:為了對(duì)文件和目錄進(jìn)程處理,你需要用到系統(tǒng)...
    JamesPeng閱讀 1,608評(píng)論 1 5
  • C/C++輸入輸出流總結(jié) 前兩天寫C++實(shí)習(xí)作業(yè),突然發(fā)現(xiàn)I/O是那么的陌生,打了好長(zhǎng)時(shí)間的文件都沒有打開,今天終...
    LuckTime閱讀 1,807評(píng)論 0 6

友情鏈接更多精彩內(nèi)容