• ベストアンサー

ソケットプログラミングについて

前回、ここで質問しましたが質問内容がきちんと記述できていなかったので、もう一度質問させていただきます。 [行いたいこと(概要)] PC1(送信端末)に保存されているファイル(jpeg,mpegファイル等)をUDPを使ってPC2(受信端末)へ送信し、PC2側でファイルを開くということです。 [現在、試していること] インターネットや本でもエコープログラミングしかサンプルプログラムがなく、実際どのようにすればよいか分かっていない状況です。以下に、プログラム内容を示します。 PC1(送信端末側) //ファイル名を入力し、ファイルをバイナリ形式で読み込み、sendto関数を用いて送信する。 FILE *fp; printf("送信ファイル名を入力:"); scanf("%s",&fname); if((fp = fopen(fname,"rb")) == NULL){ fprintf(stdout,"ファイルを開く際にエラーが発生しました\n"); exit(1); } while(!feof(fp)){    data = fgetc(fp)    sendto関数を用いて送信する } PC2(受信端末側) //ファイルポインタを用いて、受信ファイル名を記入しバイナリ形式で書き込む。while文は無限ループとし、PC1からのパケットを常時受け取る。 FILE *fp; printf("受信ファイル名を入力:"); scanf("%s",&fname); if((fp = fopen(fname,"wb")) == NULL){ fprintf(stdout,"ファイルを開く際にエラーが発生しました\n"); exit(1); } while(1){    receive関数を用いて受信する。 } 上記に示す様に作ろうと思っているのですが、実際に可能なのでしょうか? ソケットは、Windowsソケット、Linuxソケットどちらでもかまいませんので、よろしければサンプルプログラムも教えていただけないでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.7

きついことを言うようですが… ネットワーク関連のプログラミング、しかもUDPなんていうキツイ仕様を使うには修行が足り無すぎるようです。 まず、1024バイトずつバッファリングしながらローカルでファイルコピーするプログラムをつくりましょう。 buf = fgetc(fp); sendto(sock, (char*)buf, 1024, 0, (struct sockaddr *)&addr, sizeof(addr)); ファイルからデータを1024バイトづつ読む方法はわかってますか? ファイル長が1024の倍数でない場合、残った中途半端な大きさのデータのデータ長を取得する方法がわかりますか? while(1){ recvfrom(sock, buf,1024, 0,NULL,NULL); } 受信したデータをファイルに書いてません。 1024バイトに満たないデータを受け取っても、何バイト受信したか確認してません。 受信側が途中でプログラムを終わっても、送信側に教えてないし。 送信側も、受信側の都合を聞かずに送りつけてるだけだし… テクニックではなく、思慮が足りません。 通信エラーにも対応してないし。

bird_2005
質問者

お礼

>ファイルからデータを1024バイトづつ読む方法>はわかってますか? >ファイル長が1024の倍数でない場合、残った中>途半端な大きさのデータのデータ長を取得する方法>がわかりますか? 分かりません・・・・ もう少し勉強してから、掲示板に分からないことを記載するべきだと言うことを、今、痛感しています。 丁寧なご指摘ありがとうございます。

その他の回答 (7)

  • ency
  • ベストアンサー率39% (93/238)
回答No.8

ファイル転送のアプリケーションを作りたいのであれば、すでに回答にもありますが TCPソケットで作るべきです。 「まず UDPソケットを使って…」というのは、根本的に勘違いをしているような気がします。 アプリケーションプロトコルを自作する場合、TCP を使うよりも UDP を使うほうが難しいと思います。 理由は、UDP では何もしてくれないから必要な機能をすべて実装しなければならないからです。 TCP ならば、パケットが届いたのかどうかを含めて、届いていなければ再送してくれたり、順番どおりに並べ替えてくれたりしてくれるので、アプリケーションを作るほうからすれば、余計なことを考える必要がありません。 それこそ、ファイルのようにソケットに Write し、ソケットから Read すれば良いわけです。 # ま、TCP の場合、クライアントとサーバで処理でオープンする処理が # 異なるわけですが、それはまた別の話で。。。 それとも、単に UDP を勉強したから「ファイル転送のアプリケーションを作ってみたい」と思っただけでしょうか。 もしそうなのであれば、まずは数バイトのデータを UDPソケットを使って送受信するプログラムを作るところから始めましょう。 そして必要に応じて大きなファイルを送受信できるように、機能拡張していくと。。。 # 途中で TCP に切り替えるべきだとは思いますが。。。 こんなアドバイスでいかがでしょうか。

bird_2005
質問者

お礼

書き込みありがとうございます。 お返事が遅れてしまいすみませんでした。

  • uyama33
  • ベストアンサー率30% (137/450)
回答No.6

本を紹介します。 WinSock2.0 プログラミング 出版社:ソフトバンク パブリッシング株式会社 著者:Lewis Napper 500ページくらいの本で ソケットについて丁寧に書いてあります。  私はこれを参考にして メーラーを作りました。

bird_2005
質問者

お礼

書き込みありがとうございます。 参考にさせていただきます。 「猫でもわかるネットワークプログラミング」という本も分かりやすそう?でこちらも参考にしたいと思っています。

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.5

while(!feof(fp)){ buf = fgetc(fp); sendto(sock, (char*)buf, 1024, 0, (struct sockaddr *)&addr, sizeof(addr)); } 1バイトしか読んでないのに1024バイトとして送るんですか? bufは読み込んだ1バイトのデータが入ってるはずですが、それを(char *)にキャストしてるので非情に危険です。

bird_2005
質問者

補足

>>1バイトしか読んでないのに1024バイトとして送るんですか? Cのテキスト上に、(バイナリ)ファイルコピープログラムが記載されていたため、これで出来るのではないかと思いやってみたしだいです。 実際に、試してみたいこととして1024バイトずつ送信したいのですが・・・何か良い方法はありませんか?

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.4

そのプログラムだと 送信データ 1、2、3、4、5 受信データ 2、3、3,1、5(1が遅延到達、3が重複到達、4が欠落) この場合に対応できません。 ※パケットという単語はココで使うのは適当ではありません UDPの場合送信単位ごとに通信経路が変る可能性があります。 先ほども書きましたが… 順番は期待通りにならない、届かないことがある、2回以上届くこともある この3つを考えて送受信の約束事(プロトコル)を設計する必要があります。 例えば… 1.送信側---送信データ数--->受信側 2.送信側<--データ数受信OK--受信側 3.受信側でデータ数分のバッファを用意 4.送信側---データを番号付きで送信--->受信側 5.受信側で受信したデータを、番号にマッチするバッファに保存 6.データ数分4~5くり返し 7.送信側---最終データ送信完了-->受信側 8.受信側で、不足しているデータを検出して、番号リストを作る 9.送信側<---不足データ番号群---受信側 10・送信側---不足データの再送--->受信側 11.10をくり返し 12・送信側---再送完了--->受信側 13・受信側で再び不足データ検出 14.送信側<---完了or失敗報告----受信側 大雑把な流れとしてこの程度は必要です。 実際にはこれでも遅延到達データの処理や、制御データ(送信データ数、完了/失敗報告)の遅延/欠落が起こった場合に対応できていないので使い物にはなりません。

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.3

まず、UDPの基本的なことを理解してください。 ・1度に送ることができるデータはせいぜい数キロバイト ・分割送信したデータは期待通りの順番で届くという保証が無い ・送信データが通信経路上で欠落するとがある ・通信経路がルーティングされていて複数の経路を取りえる場合、同一のデータが複数の経路から重複して到達してしまうことがある どうしてもUDPで送りたいなら大雑把な流れとして ・送信側でデータを分割して、シーケンス番号を付けて送信 ・受信側で受信したデータを、シーケンス番号をもとに組み立てるが、欠損部分があれば再送を要求 ・送信側は再送要求を受けると、該当部分を再送 ・送受信の互いに満足したら(諦めがついたら?)通信終了 こんな感じでしょうか。 もちろん、細かい約束事の取り決めが必要です。

bird_2005
質問者

補足

書き込みありがとうございます。 UDPの機能は、だいたい分かっているのですが、プログラミングのスキルが追い付いておりません・・・が勉強していきたいと思っています。 試しにUDPのプログラムをサンプルを参考にしながら作ってみたのですが、案の定、送信側から受信側へファイルが送信されていません。以下にプログラムを示します。 以下のプログラムは、受信側を立ち上げておいてから送信側を起動します。 送信側と受信側プログラムの一部を記述します。 [送信側] printf("読み込みファイル名を入力:"); scanf("%s",&fname); if((fp = fopen(fname,"rb")) == NULL){ fprintf(stdout,"ファイルを開く際にエラーが発生しました\n"); exit(1); } while(!feof(fp)){ buf = fgetc(fp); sendto(sock, (char*)buf, 1024, 0, (struct sockaddr *)&addr, sizeof(addr)); } fclose(fp); closesocket(sock); [受信側] printf("書き込みファイル名を入力:"); scanf("%s",&fname); if((fp = fopen(fname,"wb")) == NULL){ fprintf(stdout,"ファイルを開く際にエラーが発生しました\n"); exit(1); } memset(buf, 0, sizeof(buf)); printf("接続を待ち\nクライアントプログラムを動かしてください\n"); while(1){ recvfrom(sock, buf,1024, 0,NULL,NULL); } fclose(fp); closesocket(sock); 上記プログラムは、ファイルポインタを使用してファイルを指定し、1024バイトずつUDPで送信。受信側は無限ループとして送信側からのパケットを常時受信する。と言う風に作ったつもりです。 シーケンス番号等は付けておりません。 よろしくお願いします。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

今回のケースでは、UDPによる転送は無理があります。1回の送信で送信出来るサイズは、限られていますので、ファイル(たぶん1Mバイトはあるでしょう)を、1回の送信では、送れません。 従って、TCP/IPの手順で送ることになります。 TCP/IPの簡単なサンプルが表示されたURLを示しますので、そちらを参考にして下さい。

参考URL:
http://www.bmc.riken.go.jp/~onishi/programming/tcp_linux.html
bird_2005
質問者

お礼

書き込みありがとうございます。 示していただきました、サンプルを参考に作っていきたいと思っています。 これからも、掲示板に書き込みした際には、よろしくお願いします。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

なんでUDPを使うのかな。 UDPはシーケンスチェックも到着確認もないので、そういう部分はアプリケーションでカバーしなければならない。TCPの方が簡単だと思うが。 特に画像ファイルのような大きいデータは1パケットに入りきらないので複数パケットの到着順管理も必要で、回答に簡単なサンプルをかけるようなものでもない。 どうしてもUDPでのファイル転送が必要なら確かtftpコマンドがUDPを使っていたと思うので、このソースでも読むのが手っ取り早いでしょう。

bird_2005
質問者

お礼

書き込みありがとうございます。 UDPの機能については、だいたい知っているのですが、プログラミングが苦手でして・・・・。 まずは、UDPを使って練習をしようと思っています。

関連するQ&A

  • ソケットプログラミングについて

    こんにちは。 以前、この掲示板に質問させていただいた者です。 送信側から受信側へWinsockを利用し、jpeg,mpegファイルを送信したいのですが、プログラムを実行すると強制終了されてしまいます。以下に主要部分を記述します。 [送信側] FILE *fp; char fname[100]; printf("読み込み用ファイルを入力して下さい:"); scanf("%s",fname); if((fp = fopen(fname,"rb")) == NULL){ printf("入力ファイルをオープンできない。\n"); exit(1); } char send_buf[1025]; int nRet; int n; while(n = fread(send_buf,1,1024,fp) != -1){ sendto(theSocket,send_buf,n,0,(LPSOCKADDR)&saServer,sizeof(struct sockaddr)); } fclose(fp); closesocket(theSocket); [受信側] FILE *fp; char fname[100]; printf("書き込み用ファイルを入力して下さい:"); scanf("%s",fname); if((fp = fopen(fname,"wb")) == NULL){ printf("出力ファイルをオープンできない。\n"); exit(1); } char Recv_buf[1025]; char size; SOCKADDR_IN saClient; while(1){ size = recvfrom(theSocket,Recv_buf,1024,0,(LPSOCKADDR)&saClient,&nLen); fwrite(Recv_buf,size,1,fp); } fclose(fp); closesocket(theSocket); 受信側を先に起動し、送信側を起動。送信側で1024バイトずつ送信し、受信側でwhileの無限ループを用いて送信側からのデータを受信するプログラムにしたつもりです。しかし、送信側で読み込みファイルを指定すると強制終了されてしまいます。ファイルオープンの仕方がおかしいのでしょうか?また、上記のプログラムでは1024バイトずつ送信できるようになっていますでしょうか? よろしくお願いします。

  • ソケットプログラミングによるファイル送信について

    VC++.NETを利用して、Winsockにてファイル送信プログラムを作成しています。ソケットはUDPを使用しています。 [行いたいこと] A→B端末へ、1024Byteずつバイナリデータ(画像)を送信。 [現在行っていること(A端末側のプログラムの概略)] 1.ファイルオープン 2.fread関数にてバイナリデータの入力(whileにてループ) 3.A→Bへパケットを1024Byteずつ送信。 #define DATA_SIZE 1024 main{ int n; char send_Buf[DATA_SIZE + 1]; if((fp = fopen(fname,"rb+")) == NULL){ printf("ファイルエラー\n"); exit(1); } //nが0でなくなったら、ループを抜ける。 while((n = fread(send_Buf,1,DATA_SIZE,fp)) != 0) { sendto(s, send_Buf, n, 0, (LPSOCKADDR)&addrin, sizeof(addrin)); } } A側でビルドはできますがエラーが発生して実行できません。 よろしければ教えていただけないでしょうか。C言語の基礎もきちんと出来ていないからなのかもしれません・・・>< よろしくお願いします。

  • ソケットプログラミングについて

    こんにちは。 前回、質問しました「バード」という者です。 ソケットプログラミングについて質問します。 PC1から、jpegやmpegファイルを送信しPC2で受信するというプログラムをC言語で作ってみたいと思っています。 以前、少しだけJAVAプログラミングでPC1(送信側)からPC2(受信側)へデータを送信するプログラムを作ったのですが、作ったプログラムの概要を以下に示します。 [送信側] (ファイルオープン) InputStream in = new FileInputStream(ss); BufferedInputStream bin = new BufferedInputStream(in); ↓ (データを読みsendメソッドにて随時送信) while((c = bin.read(buffer, 0, buffer.length))!=-1){ dPacket = new DatagramPacket(buffer,buffer.length,iAddress,port); dSocket.send(dPacket); } ↓ (ファイルとソケットクローズ) dSocket.close(); [受信側] (ファイルオープン) OutputStream out = new FileOutputStream(args[1]); BufferedOutputStream bout = new BufferedOutputStream(out); ↓ (送信側から来たデータをreceiveメソッドにて受信) while(true){ dPacket = new DatagramPacket(buffer,buffer.length); dSocket.receive(dPacket); } ↓ (ファイルとソケットクローズ) dSocket.close(); 上記に示す様に、ファイルをオープンし、DatagramSocketとDatagramPacketクラスを用いて送受信し最後に、ファイルをクローズするという形式をとっていました。 C言語の場合でも、ファイルオープン→send関数,receive関数等を用いて送信・受信→ファイルクローズという形をとる事ができるのでしょうか?FTPプログラムやエコープログラムを、よく見かけるのですが・・・・

  • ソケットプログラミング(配列について)

    こんにちは。 この掲示板に、大変お世話になっています。 私は送信側から受信側へWindows上でUDPソケットを利用し、約3MByteのmpegデータを、1024Byteずつパケットに分割し送信しています。以下に、送信側のプログラムの概要を示します。 [送信側] ・配列[1025]確保し、fread関数を用いてファイルの読み込みを行い、sendto関数で受信側へ送信。 ・1024Byteずつ送出できているかを表示。 ・送出した1024Byteのパケット数を表示。 int n; int Num_n = 0; char send_buf[1025]; while((n = fread(send_buf,1,DATA_SIZE,fp)) != 0){ Num_n++; //1024Byteずつ送出できているかを表示させています printf("n:%dバイト\t",n); sendto(theSocket,send_buf,n,0,(LPSOCKADDR)&saServer,sizeof(struct sockaddr)); } //送出したパケット数を表示させています printf("%d個のパケットを送出しました\n",Num_n); <質問内容> 約3MByteのmpegを1024Byteずつ送信した場合、最後のパケットは、「n:4バイト」と表示されました。残りの1020バイト分は、どのような形で送信されているのでしょうか?確保した配列内に何も入っていない形で送信されているのでしょうか? また、私は送信側と受信側でスループットの計算を以下の式から算出しています。 送信側 (送信したパケット数×1024×8)/送信に要した時間 受信側 (受信したパケット数×1024×8)/受信に要した時間 送信したパケット数は3041個。 送信に要した時間=受信に要した時間です。 この場合、送信側での計算として・・・ (3041×1024×8)/送信に要した時間とするのか (3040×1024×8)+4/送信に要した時間とするのか どちらが正当なのでしょうか? よろしくお願いします。

  • Winsockを利用した単純なファイル送信プログラムについて

    こんばんは。 何度もこの掲示板を利用させていただいている者です。 WinsockのUDPを用いて簡単なファイル送信プログラムを作っています。UDPを使わずに、TCPを使用したほうが良いのでは?とのご指摘をいただきましたが、まずは、UDPを利用した単純なファイル送信プログラムを作ってみたいと思っています。 しかし、送信側から受信側へファイルがうまく受信できていません。もしかしたら、送信側自体がきちんと送信できていないのかもしれません。 以下にそのプログラムの概要と内容を示します。 [概要] 送信側→受信側にUDPを用いて、送信側にあるjpegまたはmpegファイルを送信し、受信側でファイルを開く。 [プログラム概要] ・送信側 ファイルポインタを用いてファイルオープン fread関数とsendto関数を用いて1024バイトずつ送信 ・受信側 ファイルポインタを用いてファイルオープン whileの無限ループ内に、recvfrom関数とfwrite関数を用いて送信側からのデータを受信 [プログラムの内容] ・送信側 printf("読み込み用ファイルを入力して下さい:"); scanf("%s",fname); if((fp = fopen(fname,"rb")) == NULL){ printf("入力ファイルをオープンできない。\n"); exit(1); } char send_buf[1025]; int n; while(n = fread(send_buf,1,1024,fp) != -1){ sendto(theSocket,send_buf,n,0,(LPSOCKADDR)&saServer,sizeof(struct sockaddr)); } ・受信側 char Recv_buf[1025]; char size; SOCKADDR_IN saClient; while(1){ size = recvfrom(theSocket,Recv_buf,1024,0,(LPSOCKADDR)&saClient,&nLen); fwrite(Recv_buf,size,1,fp); } ご指摘またはご教授をいただけたらと思います。 よろしくお願いします。

  • C言語のプログラミングで困っています

    C言語を勉強しています。まだまだ初心者で分からないことだらけなのですが、今回はファイル入出力の部分が分からず苦戦しています。 『100個の実数が入った2つのテキストファイルから数値を読み込み、  絶対値を求めるなどの計算をする』プログラムを作成しているのですが、 コンパイルし実行すると強制終了してしまいます。 プログラムは、 void main(void) { FILE *fp; double c[50000];   double d[50000];   double e[50000]; int n = 0;   int m = 0;   int i = 0;   char fname[80];   char fname2[80]; printf("ファイル名 : ");    gets(fname); if((fp = fopen(fname, "r")) == NULL){ printf("ファイルがオープンできません\n"); exit(1); } printf("\n"); while (fscanf(fp,"%lf",&c[i])!=EOF){ printf("%3d : %3lf",++n,c[i]); printf("\n"); i++; } printf("\n"); i=0; n=0; printf("ファイル名 : ");    gets(fname2); if((fp = fopen(fname2, "r")) == NULL){ printf("ファイルがオープンできません\n"); exit(1); } printf("\n"); while (fscanf(fp,"%lf",&d[i])!=EOF){ printf("%3d : %3lf",++n,d[i]); printf("\n"); i++; } …(以下計算) のようになっています。 整数のデータで計算を行うと、正常に動くのですが…。 コンパイルしてもエラーが出ないので、どこが悪いのかわからず困っています。 どなたか教えていただけないでしょうか。お願いしますm(_ _)m

  • WinSockを用いたUDP送受信ソケットプログラミングについて

    こんにちは。 現在、VC++.NETでWinSockを用いたUDPソケットプログラミングを行っています。以下のようなプログラムを作りたいと思っているのですがうまく動作しません。 [概要] A:送信端末 B:受信端末 1.Aから文字列"send"をB端末へ送信。 2."send"を受信した受信端末Bは、A端末へ文字列"ok"を送信。 この1と2の動作を行わせたいと思っています。この場合、A,B端末は送信と受信を行う必要があります。 [問題点(うまくいかない点)] A→Bへ"send"は送信でき、B端末で受信できるのですが、B端末からA端末へ送信できません。B端末で送信できているのか、それともA端末で受信できていないのか?が分からない状態です。 [気づいた点] ポート番号を分ける必要があるのでしょうか?例えば、A→Bへは9000番。B→Aへは9001番という意味です。 送信と受信を行うため、送信・受信で2つのUDPソケットを使用する必要があるのでしょうか?例えば、 s1 = socket(AF_INET, SOCK_DGRAM, 0);←送信に利用 s2 = socket(AF_INET, SOCK_DGRAM, 0);←受信に利用 よろしくお願いします。

  • 複数テキストファイルを読み込み、複数テキストファイルの出力

    質問は100個のテキストファイル(それぞれ10個のデータを含む)を読み込み、それぞれのテキストファイルから5個ずつデータを抽出し、200個のテキストファイルとして出力するというプログラムについての質問です。 以下が僕の作ったファイル出力部分のプログラムです。 /************/ void ecg_rr(fp,data_max) FILE *fp; { int b,i=0; int c=1; char fname[64]; data[0][i]=trend_data[0][i]; for(i=0;i<100;i++) sprintf(fname,"ss[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][0]); fprintf(fp,"%8.8f\n",data[0][2]); fprintf(fp,"%8.8f\n",data[0][4]); fprintf(fp,"%8.8f\n",data[0][6]); fclose(fp); sprintf(fname,"sk[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][1]); fprintf(fp,"%8.8f\n",data[0][3]); fprintf(fp,"%8.8f\n",data[0][5]); fprintf(fp,"%8.8f\n",data[0][9]); fclose(fp); } 複数ファイルの読み込み方がわからず、自分のプログラムだと1つのテキストファイルしか読み込めないので、16_4.batを作り、その中身を 16_4 読み込むテキストファイル名1.txt ss[1] 16_4 読み込むテキストファイル名1.txt sk[1] 16_4 読み込むテキストファイル名2.txt ss[2] 16_4 読み込むテキストファイル名2.txt sk[2] ・・・ とやったのですが、うまくいきませんでした。 どうすればよいのでしょうか。

  • ファイルの入出力で困っています(C言語)

    はじめまして、nathan3と申します。 昔、さらっとC言語を学んでいたので、仕事場でも活用できればと思い、勉強しなおしています。 以下のプログラムですが、コンパイルはするものの、実行がなされません。 sprintfをつかってファイルを作り、fprintfで読み込み、countで繰り返し別名のファイルを読み込み・作成し…といったプログラムを書いているつもりです。 調べながら書いた稚拙なプログラムですが、ここがちがう!というところをお教えいただけると大変助かります。 #include <stdio.h> int main(void){ FILE *fp,*fo; char *fname1; char *fname2; char s[100],t[100]; int ret,count; for(count = 0 ; count < 3 ; count++) { sprintf(fname1, "sankasha%d.txt", count); fp = fopen(fname1, "r"); if (fp == NULL){ printf("%s can't open a file\n", fname1); return -1; } sprintf(fname2, "matome%d.txt", count); fo = fopen(fname2,"w"); if (fo == NULL){ printf("%s can't open a file\n", fname2); return -1; } printf("--fscanf---"); while( (ret = fscanf(fp,"%[^,],%s", s, t)) != EOF ){ fprintf(fo,"%s ", t); } } fclose(fo); fclose(fp); return 0; } 何度見直しても間違いが見つからず困窮しております。 どうぞ、みなさまのお力をお貸しください! よろしくお願いいたします。

  • どうやってフローチャートを書きますか

    #include<stdio.h>   void main()   {   FILE*fp;   char buf[128];   char *rc;   char fname[20];   do{   printf("file name>>>");   scanf("%s",fname);   fp=fopen(fname,"r");   if=(fp==NULL) printf("File Open Err¥n");   }while(fp==NULL);   rc=fgets(buf,128,fp);   while(rc!=NULL){    printf("%s",buf);    rc=fgets(buf,123,fp);    }    fclose(fp);    }

専門家に質問してみよう