ファイルの書き込みでなぜか違うデータが書き込まれる
Posted: 2012年2月19日(日) 14:16
こんにちはshiro4aoです。
試しにhttpレスポンスからhtmlボディを取り出すソフトを書いてみようと思いました。
かなり胡散臭い方法で切りだそうとしているのですが、
方法が稚拙という点以外に問題が出ました。
下記コードの書き込み用バッファoutputに書きこまれた内容と
fwrite()で出力したファイルの中身が違うのです。
「データの先頭や末尾がなくなった」という状態ではなく、
「頻繁に欠けている部分が発生する」という状態でお手上げになってしまいました。
何か解決方法はありますでしょうか。
試しにhttpレスポンスからhtmlボディを取り出すソフトを書いてみようと思いました。
かなり胡散臭い方法で切りだそうとしているのですが、
方法が稚拙という点以外に問題が出ました。
下記コードの書き込み用バッファoutputに書きこまれた内容と
fwrite()で出力したファイルの中身が違うのです。
「データの先頭や末尾がなくなった」という状態ではなく、
「頻繁に欠けている部分が発生する」という状態でお手上げになってしまいました。
何か解決方法はありますでしょうか。
#include <stdio.h>
#include <openssl/rc4.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
int SplitContent(char *in)
{
FILE *fp,*fp2;
char *data;
char *output;
size_t size;
int bufsize;
int Count;
char Cbuf[100];
char *p,*p2,*p3;
int ContentLength;
Count=0;
data=(char*)malloc(sizeof(char)*10);
bufsize=10;
size=bufsize;
while(1){
fp = fopen(in, "rb" );
if( fp == NULL )
{
printf( "%sが開けません",in );
return 1;
}
bufsize=bufsize*2;
free(data);
data=(char*)malloc(sizeof(char)*bufsize);
memset(data,'\0',sizeof(data));
size = fread( data, 1,bufsize, fp );
fclose( fp );
if(bufsize>size)break;
}
p=data;
while(1){
//まずはコンテンツの長さを取得
p=strstr(p,"Content-Length: ");
if(p==NULL)break; //ないなら抜ける
p=p+16;
ContentLength=atoi(p);
//書き込み用バッファ準備
output=(char*)malloc(sizeof(char)*ContentLength);
memset(output,'\0',sizeof(output));
//コンテンツの前まで移動
p=strstr(p,"Connection: keep-alive");
p=p+25;
//コンテンツをバッファへコピー
memcpy(output,p,ContentLength);
printf("\n\n\n\n%d\n\n\noutput=-%s-\n\n",Count,output); //確認用出力
getch();
Count++;
itoa(Count,Cbuf,10);
strcat(Cbuf,".htlm");
fp2 = fopen(Cbuf , "wb" );
if( fp2 == NULL )
{
printf( "%sが開けません" ,Cbuf);
return 1;
}
//バッファをファイルへ書き込み
fwrite( output, 1,ContentLength, fp2 );
fflush(fp2);
fclose( fp2 );
free(output);
}
free(data);
return 0;
}
int main(int argc,char *argv[]){
SplitContent(argv[1]);
}