zoukankan      html  css  js  c++  java
  • 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()要用二进制形式打开!

  • 相关阅读:
    基本控件文档-UIView属性---iOS-Apple苹果官方文档翻译
    基本控件文档-UITextField属性---iOS-Apple苹果官方文档翻译
    vue后台管理权限篇
    JavaScript call、apply、bind的用法
    Array map()方法
    markdown常用语法总结
    webpack配置说明
    Object.prototype.toString.call(value)
    前后端数据交互和前端数据展示
    vue常用的传值方式
  • 原文地址:https://www.cnblogs.com/zzzPark/p/6441016.html
Copyright © 2011-2022 走看看