Linux c/c++圖片傳輸功能(中級版)


在用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()要用二進制形式打開!

 


免責聲明!

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



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