質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

1707閲覧

libcurlでファイルから画像取得

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/03/19 07:30

Debian 9.2 Stretch でvimとgccでc言語を学んでいます。前回に引き続き、libcurlについて質問です。今回はあらかじめ取得したい画像のURLを記したテキストファイル(仮にURL.txtにする)から、書いてあるURLを一つずつ読み込んでlibcurlで画像を取得して、image1.jpg,image2.jpg・・・という名前で順番に保存していくプログラムを書いたつもりなんですが、うまく動作しません。画像ファイルはできるんですが、0バイトで、内容が保存されていません。どこが間違っているのでしょうか?詳しい方お願いします。ソースは以下です。
#include<curl/curl.h>
#define MAX_LINE 128

int main(int argc,char *argv[]){
int i=1;
char str[64];
FILE *fp,*fp2;
char buffer[MAX_LINE];
fp=fopen("URL.txt","r");

CURL *curl; CURLcode res; while(fgets(buffer,MAX_LINE,fp)!=NULL){ sprintf(str,"image%d.jpg",i); curl_easy_init(); curl_easy_setopt(curl,CURLOPT_URL,buffer); fp2=fopen(str,"wb"); curl_easy_setopt(curl,CURLOPT_WRITEDATA,fp2); res=curl_easy_perform(curl); long http_code=0; curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE,&http_code); i++; } fclose(fp); fclose(fp2);

return 0;
}

URL.txtの内容
http://www.wallpaper-box.com/sky/images/sky14.jpg
http://www.wallpaper-box.com/sky/images/sky15.jpg
http://www.wallpaper-box.com/sky/images/sky31.jpg

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

何個か指摘事項がありますので、コメントを読んで下さい。

c

1#include <curl/curl.h> 2#include <stdio.h> 3#define MAX_LINE 128 4 5int main(int argc,char *argv[]){ 6 int i = 1; 7 char str[64]; 8 FILE *fp,*fp2; 9 char buffer[MAX_LINE]; 10 CURL *curl; 11 CURLcode res; 12 char error[CURL_ERROR_SIZE]; 13 14 fp = fopen("URL.txt","r"); 15 if (!fp) { 16 perror("fopen"); 17 return -1; 18 } 19 20 while (fgets(buffer, MAX_LINE, fp) != NULL) { 21 /* buffer は行なので改行文字が混じる、よって削除 */ 22 char *p = strpbrk(buffer, "\r\n"); 23 if (p) *p = 0x00; 24 25 sprintf(str,"image%d.jpg",i); 26 27 /* curl 変数が初期化されていない */ 28 curl = curl_easy_init(); 29 curl_easy_setopt(curl, CURLOPT_URL, buffer); 30 fp2 = fopen(str,"wb"); 31 if (!fp2) { 32 perror("fopen"); 33 return -1; 34 } 35 curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error); 36 37 /* CURLOPT_WRITEFUNCTION が設定されてない */ 38 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite); 39 curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp2); 40 41 res = curl_easy_perform(curl); 42 /* curl 変数がクリアされていない */ 43 curl_easy_cleanup(curl); 44 45 /* fp2 は都度閉じないとリークする */ 46 fclose(fp2); 47 48 if (res != CURLE_OK) { 49 fprintf(stderr, error); 50 return -1; 51 } 52 i++; 53 } 54 fclose(fp); 55 56 return 0; 57}

投稿2018/03/19 07:52

編集2018/03/19 08:09
mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/03/19 11:18

詳細な解答をありがとうございました。提示していただいたコードに修正して実行すると、期待したとおりの挙動ができましたので、今回はmattnさんの解答をベストアンサーに選ばせていただきます。他の方々もどうもありがとうございました。助かりました。
guest

0

ちと別方面から、、
C言語を学んでいる、というなら、Windowsマシン上にEclipseを入れてみてはどうでしょう

http://mergedoc.osdn.jp/

この中のC/C++プラグイン付きのユニットをインストールすれば、統合環境からのコード入力、ブレークポイントやワンステップ実行から変数のモニタなどのデバッグ環境が手に入ります

#Debian上でやりたいという向きには自分でEclipseにCDTパッケージを入れるなど手間かかりますが

投稿2018/03/19 08:05

編集2018/03/19 08:11
y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/03/19 13:05

回答ありがとうございました。Eclipseは一応Debianパッケージからダウンロードだけはしていますので、(Wheezyのときには公式パッケージには入ってなかったんですが、Stretchには入ってるんです)機会があったら使い方をよく学んでみようと思います。どうもありがとうございました。
guest

0

fgetsって複数行から入力すると末尾に改行文字がくっつきます。

c

1while(fgets(buffer,MAX_LINE,fp)!=NULL){ 2buffer[strcspn(buffer, "\n")] = 0;

で改善するかと思います。

投稿2018/03/19 07:45

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/03/19 11:32

回答ありがとうございました。改行文字がfgetsで取得してしまうということは、全く知りませんでした。まだまだ勉強が足りないと分かりました。
guest

0

問題の切り分けのために、まず1行だけ書かれたURL.txtで試してみてはいかがでしょう。

良くあるミスとしては、読み込んだURLの改行文字までURLとしてリクエストしてしまっているとか。あてずっぽですけど。

投稿2018/03/19 07:39

kazto

総合スコア7196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/03/19 11:24

解答ありがとうございます。他の方々の解答を見ると、kaztoさんのご指摘の通りなのだと思います。またわからないことがあったら質問するかもしれませんので、そのときはよろしくおねがいします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問