關於fopen:w和wb,文本和二進制文件處理的區別


網上查找了很多的文章,對於文本方式打開w和wb打開文件,一般說是兩個不同:

1. 文件的讀取問題, 換行符,如果用正常的fprintf會因為不同的平台, 寫入不同的換行符 window “\r\n” unix\linux "\n" mac "\r",對應的文本文件讀取的時候不同平台並不能一個換行符通用。

2. 另外一個是說,對應的不同二進制和文本會寫入不同的fprintf字符或者直接是fwrite對應數據。

對於這里我理解的是,因為fwrite是寫數據流,並不是轉成字符串,fprintf 會根據參數 format 格式控制符,把對應的數據轉換成字符串對應的寫入文件中。 測試代碼:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

 
         

struct tagInfo {
int m_nNum;
char name[20];
int m_nVale;
tagInfo() {
m_nNum = 0;
m_nVale = 0;
memset(name, 0, 20);
}
void view() {
printf("tagInfo->m_nNum:%d\t", m_nNum);
printf("tagInfo->name:%s\t", name);
printf("tagInfo->m_nVale:%d\n", m_nVale);
}
};

 
         


void testing_fopen_write() {
tagInfo tInfo;
tInfo.m_nNum = 111;
memcpy(tInfo.name, "Hello", sizeof("Hello"));
tInfo.m_nVale = 222;
tInfo.view();

 
         

FILE* pFileW_fprintf = fopen("tesingFopen_w_fprintf.txt", "w+");
FILE* pFileW_fwrite = fopen("tesingFopen_w_fwrite.txt", "w+");
FILE* pFileWB_fprintf = fopen("tesingFopen_wb_fprintf.txt", "wb+");
FILE* pFileWB_fwrite = fopen("tesingFopen_wb_fwrite.txt", "wb+");

 
         

fprintf(pFileW_fprintf, "%d%s%d", tInfo.m_nNum, tInfo.name, tInfo.m_nVale);
fprintf(pFileWB_fprintf, "%d%s%d", tInfo.m_nNum, tInfo.name, tInfo.m_nVale);
fwrite(&tInfo, sizeof(tagInfo), 1, pFileW_fwrite);
fwrite(&tInfo, sizeof(tagInfo), 1, pFileWB_fwrite);

 
         

fclose(pFileW_fprintf);
fclose(pFileW_fwrite);
fclose(pFileWB_fprintf);
fclose(pFileWB_fwrite);

 
         

}

 
         

void testing_fopen_read() {

 
         

tagInfo tInfoW_fscanf;
tagInfo tInfoW_fread;
tagInfo tInfoWB_fscanf;
tagInfo tInfoWB_fread;

 
         

FILE* pFileW_fscanf = fopen("tesingFopen_w_fprintf.txt", "r+");
FILE* pFileW_fread = fopen("tesingFopen_w_fwrite.txt", "r+");
FILE* pFileWB_fscanf = fopen("tesingFopen_wb_fprintf.txt", "rb+");
FILE* pFileWB_fread = fopen("tesingFopen_wb_fwrite.txt", "rb+");

 
         

fread(&tInfoW_fread, sizeof(tagInfo), 1, pFileW_fread);
fread(&tInfoWB_fread, sizeof(tagInfo), 1, pFileWB_fread);

 
         

fscanf(pFileW_fscanf, "%d%s%d", &tInfoW_fscanf.m_nNum, &tInfoW_fscanf.name, &tInfoW_fscanf.m_nVale);
fscanf(pFileWB_fscanf, "%d%s%d", &tInfoWB_fscanf.m_nNum, &tInfoWB_fscanf.name, &tInfoWB_fscanf.m_nVale);

printf("-------分割線-------");
tInfoW_fscanf.view();
printf("-------分割線-------");
tInfoW_fread.view();
printf("-------分割線-------");
tInfoWB_fscanf.view();
printf("-------分割線-------");
tInfoWB_fread.view();
}

 
        

不管是w方式還是對應wb方式,對應文件都是打開的,只是調用接口的不同,同樣對應同樣的接口寫入,應該用相對應的接口讀取,否則數據不能直接運用。 這里我並沒有測試fgetc() getc() 等函數測試。所謂的區別,就是接口調用的不同,另外不同平台對應換行的不同。


免責聲明!

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



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