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()要用二进制形式打开!

原文地址:https://www.cnblogs.com/zzzPark/p/6441016.html