在用C語言完善傳輸圖片模塊的時候發現了一個問題!
就是圖片的二進制本質,和c語言的IO流局限!
以下兩個函數是C 的打開圖片文件和讀取圖片文件的函數!
FILE *out=fopen(path,"r");
int c;
while((c=fgetc(out))!=EOF)//open /root/photo_in/cat.jpg
{
//..deal with the tranformation
}
這里導致一個嚴重的問題,當每獲取一個數據都是一個int 類型的數字。(小於等於255)
比如 12 125 231
當轉換成char []數組發到套接字上。
假如服務進程很快,取下了一個又一個套接字里的數字,12 125 231 並寫入自己打開的newfile!這固然很好。
但要是服務進程此時慢了,還沒有取套接字里的數字,套接字里就會壓滯成 12125231。此時服務進程取下12125231不知咋辦。
所以還是用C++的IO流會更好!
以下是個例程序:
#include<stdio.h>
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
char* path="/root/photo_in/cat.jpg";
char* path2="/root/photo_out/newcat.jpg";
char* buf;
long size=10;
buf=new char[size];
ifstream pic;
ofstream newpic;
pic.open(path,ios::binary);
newpic.open(path2,ios::binary);
if(!pic.is_open()){ cout<<"open error!"; return 0;}
cout<<"open sucess!";
int n;
while(! pic.eof()){
pic.read(buf,size);
newpic.write(buf,size);
// if(n>0){
cout<<"buf: %s"<<buf<<" ";
// else{
// cout<<"read nothing!";}
}
}
聲明一個ifstream類對象,比如叫pic!然后用pic的open函數圖片文件,用ios::binary二進制形式打開。
只有用二進制形式打開才是連續的數據,可以切分發送。
然后定義一個地址char* buf。size 是長度。read(buf,size);是把二進制數據讀入這個buf地址,長度為size!
然而修改過后的服務端程序 和 客戶端程序 都是C++/C 語言混合起來的!
所以編譯起來有點麻煩!所以還是放棄這樣修改了!
最后修改成 fopen() fread() fwrite()的幾個常用函數操作圖片文件。只是fopen()要用二進制形式打開!