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