網上查找了很多的文章,對於文本方式打開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() 等函數測試。所謂的區別,就是接口調用的不同,另外不同平台對應換行的不同。