linux下 c语言 用write open二进制写文件,Linux下用C语言fopen、fread和fwrite函数对二进制文件的操作-Go语言中文社区...
一、前言
在做一個鏡頭的初始化操作,需要加載一個648*522像素大小的文件,廠商提供的是一個excel表,如果要加載數據,可用加載txt文本的方式,我選用二進制方式加載文件;大家都知道電腦真正執行的不是高級語言,而是0和1的二進制文件,而且不管你是幾維的數據,存放計算機內存上的數據是一維,而且按一定順序執行下來(雖然操作系統原理介紹到在宏觀上有并行處理,但微觀上還是串行執行的)。所以直接加載二進制文件效率是最高的,摒棄了數據轉換所涉及的一個資源開銷,有時候還會有精度損失。
二、操作二進制文件相關的函數
操作二進制的相關函數,引用標準庫頭文件#include
/*
*@fopen 該函數打開一個特定的文件,并返回一個流于該文件進行關聯;
*@param name:打開文件或者一個設備的名稱;
* mode:提示打開文件的方式;
* ①文本文件: 讀取:“r”,寫入“w”,添加“a”;
* ②二進制文件:讀取:“rb”,寫入“wb”,添加“ab”;
* 讀取mode:要求所打開的文件一定要存在;
* 寫入mode:當打開的文件不存在,程序會新建一個文件;但打開的文
* 件存在,會刪除原始內容重新寫入數據;
* 添加mode:當打開的文件不存在,程序會新建一個文件;但打開的文
* 件存在,在原始內容上繼續添加內容;
*@return fopen函數的返回FILe*類型,成功返回非NULL
*/
FILE* fopen(char const *name, char const *mode);
/*
*@fclose 關閉流函數;
*@param fp:所要關閉的流;
*@return fclose在文件關閉之前刷新緩沖區,成功執行返回零值,失敗返回EOF;
*/
int fclose(FILE* fp)
/*
*@fread 二進制文件讀取函數
*@param buffer:讀取的數據所存放內存位置的指針;
* size: 緩沖區每個元素的Byte數,可用sizeof(類型)判斷;
* count: 讀取數據的元素個數;
* stream:要讀取的數據流
*@return fread返回實際讀取元素的數目(非字節數,由讀取每個元素的類型決定)
*/
size_t fread(void *buffer, size_t size, size_t count, FILE* stream);
三、程序測試
1、數據源的獲取
excel的數據源如下圖,從紅色標示可以看出數據龐大,30多萬的數據:
把excel的數據導成txt文件;
再把txt文件用工具轉換成二進制文件;
2、測試main函數
#include
//#include //用linux環境的gcc4.6.2編譯,沒有此頭文件在分配動態內存時會警告malloc與free不兼容的問題
#define COL 522//數據的列
#define ROW 648//數據的行
int main(int argc, int *argv[]){
FILE * fp = NULL;//定義先賦值為NULL
unsigned char *buf;
int ret, i= 1;
//分配動態內存保存讀取二進制文件的數據,因為每個點的值在0~255之間(0~1111 1111),用8位bit的char型即可;
buf = (unsigned char *)malloc(ROW*COL*sizeof(char));
//打開二進制文件,選取相應的模式,我的STD6DDAC.BIN二進制文件放在LINUX系統的/opt/目錄下;
fp = fopen("/opt/STD6DDAC.BIN", "rb");
if( NULL == fp ){
return (-1);
}
//讀取文件,并返回所讀取char型數據元素的個數;
ret = fread(buf, sizeof(unsigned char), ROW*COL, fp);
if(ret < 0){
printf("read data error!n");
}
printf("The value of ret is:%dn", ret);
//讀取前100個數據,可以打印上面數據源的100個數據
printf("Read the first 100 data______n");
for(i = 0;i < 100;i++){
printf("%dt", buf[i]);
if((i+1)%10 == 0){
printf("n");
}
}
//判斷數據是否完整,讀取后100個數據基礎上并多讀2個數據;
printf("Read more than two data more than last 100 data___n");
for(i = ROW*COL-100;i < ROW*COL+2;i++){
printf("%dt", buf[i]);
if((i+1)%10 == 0){
printf("n");
}
}
printf("n");
fclose(fp);//關閉文件,避免內存泄露或下次訪問出錯;
fp = NULL;//文件指針指向空,避免出現游離指針;
free(buf);//釋放所開辟的動態內存;
return 0;
}
3、測試結果
可以看到讀取的數據元素個數為:338256 = 648*522;所以在打開文件或者讀取數據之后,千萬千萬一定一定要加判斷,可以查看程序是否操作成功,為調試代碼提供不了不少方便;而且前面前面的數據與上面excel中數據源完全匹配(由excel數據太多,右端的部分數據顯示不出來),而讀取超出338256個數據之后的2個數據,完全是0,可以判斷讀取二進制文件的數據時成功的。fwrite()函數就不用細說了,原理跟fread()類似,只是一個是寫入,一個是讀取;
總結
以上是生活随笔為你收集整理的linux下 c语言 用write open二进制写文件,Linux下用C语言fopen、fread和fwrite函数对二进制文件的操作-Go语言中文社区...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue.js php,vue.js去哪
- 下一篇: linux gpio按键驱动程序,Lin