K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]


新規投稿 | 開設者ホームページへ戻る | ヘルプ


[2032] C言語ポインタ完全制覇 第1版 4-2-1 可変長配列の配列についての質問
返信


投稿者:884
2017/12/06 13:57:34

Link:
はじめまして。

現在、C言語ポインタ完全制覇 第1版で学習しています。

4-2-1 可変長配列の配列で疑問があり、質問させていただきます。

List4-5 read_slogan.cで、

read_slogan(stdin, slogan);

のstdinは、キーボードの入力と考えていますが、何を入力すればよいでしょうか。
1週間分の標語ファイル(.txt)を読み込ませたいのですが、うまくいきません。

ご教示お願いいたします。

---------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void read_slogan(FILE *fp, char **slogan)
{
    char buf[1024];
    int  i;

    for (i = 0; i < 7; i++) {
        fgets(buf, 1024, fp);

        /* 改行文字を削除 */
        buf[strlen(buf)-1] = '\0';

        /* 標語ひとつ分の領域を確保 */
        slogan[i] = malloc(sizeof(char) * (strlen(buf) + 1));

        /* 標語の内容をコピー */
        strcpy(slogan[i], buf);
    }
}

int main(void)
{
    char *slogan[7];
    int i;

    read_slogan(stdin, slogan);

    /* 読み込んだ標語を表示する */
    for (i = 0; i < 7; i++) {
        printf("%s\n", slogan[i]);
    }

    return 0;
}

---------------------------------
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2035] Re:C言語ポインタ完全制覇 第1版 4-2-1 可変長配列の配列についての質問
返信


投稿者:(ぱ)こと管理人
2017/12/07 01:22:42

Link:
はじめまして。

>read_slogan(stdin, slogan);
>
>のstdinは、キーボードの入力と考えていますが、何を入力すればよいでしょうか。
>1週間分の標語ファイル(.txt)を読み込ませたいのですが、うまくいきません。

stdinはキーボードからの入力なので、たとえばコマンドプロンプトで動かしているのなら
そのままそこでキーボードから打ち込んでも入力できますし、
たとえば実行形式名がread_slogan.exeで標語ファイルがslogan.txtなら

read_slogan < slogan.txt

のようにリダイレクトで読み込ませる方法もあります。

実行しているOSが何かわかりませんが、リダイレクトはWindowsでもMacOSでも
Linuxでも使えるので、ぐぐってみてはいかがでしょうか。
たとえばWindowsなら、今探しましたが、以下のようなページがあります。
https://www.adminweb.jp/command/redirect/index4.html
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2036] Re:C言語ポインタ完全制覇 第1版 4-2-1 可変長配列の配列についての質問
返信


投稿者:884
2017/12/07 14:08:14

Link:
早速の&ご丁寧なご回答ありがとうございます。 
サンプルプログラムの内容が理解できました。 

OSは、Windows7です。 
統合開発環境 VS 2015のVisualC++ Win32コンソールアプリケーションでプロジェクトを作成し、サンプルプログラムの動作確認をしています。 

>stdinはキーボードからの入力なので、たとえばコマンドプロンプトで動かしているのならそのままそこでキーボードから打ち込んでも入力できますし、  

キーボードからの入力を、7回行ったら、入力した文字が画面に表示されました。 
VS 2015のコンソール画面で、slogan.txt(標語ファイル名)をキーボード入力するとファイルが読込まれると勘違いして、ファイル名を入力をしていました。 


>たとえば実行形式名がread_slogan.exeで標語ファイルがslogan.txtなら  
>read_slogan < slogan.txt  
>のようにリダイレクトで読み込ませる方法もあります。  

コマンドプロンプト上で、VS 2015で生成されたread_slogan.exeに、slogan.txt(標語ファイル名)をリダイレクトで読み込ませて、表示することができました。 


ここで、このプログラムにおいて、キーボードからの入力(stdin)は、void read_slogan(FILE *fp, char **slogan)側で、ファイル(FILE *fp)として、認識されるのでしょうか。 

度々、申し訳ありませんが、ご教示お願いいたします。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2041] Re:C言語ポインタ完全制覇 第1版 4-2-1 可変長配列の配列についての質問
返信


投稿者:(ぱ)こと管理人
2017/12/09 22:06:21

Link:
>ここで、このプログラムにおいて、キーボードからの入力(stdin)は、
>void read_slogan(FILE *fp, char **slogan)側で、ファイル(FILE *fp)として、
>認識されるのでしょうか。 

すみません、何が質問なのかよくわかりませんが、
リダイレクトでファイルが読み込める、という挙動についてであれば、

read_slogan < slogan.txt

というのは、read_sloganの標準入力をslogan.txtというファイルからの入力に
切り替えるという意味です。
標準入力(stdin: standard input)は、デフォルトでキーボードなのですが、
それをファイルからの入力に切り替えているので、
void read_slogan(FILE *fp, char **slogan)側では、fpからslogan.txtの
内容を読むことができます。

これで回答になっておりますでしょうか?
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2043] Re:C言語ポインタ完全制覇 第1版 4-2-1 可変長配列の配列についての質問
返信


投稿者:884
2017/12/11 17:14:06

Link:
>これで回答になっておりますでしょうか?
 おかしな質問をしてすみません。

標準入出力とファイルの関係が理解できていませんでした。
そもそも、stdinは、FILEへのポインタ型なんですね。
標準入出力は、テキストファイルと同じように、ファイルポインタで指定して、
ファイルのように扱ことができる。という理解でよいでしょうか。



[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2048] Re:C言語ポインタ完全制覇 第1版 4-2-1 可変長配列の配列についての質問
返信


投稿者:(ぱ)こと管理人
2017/12/13 01:51:10

Link:
>標準入出力は、テキストファイルと同じように、ファイルポインタで指定して、
>ファイルのように扱ことができる。という理解でよいでしょうか。

そういうことですね。
キーボードのような入力デバイスも、画面のような出力デバイスも、
なんでもファイルとして扱えるようにしてしまえ、というのは
もともとUNIXのアイディアで、たとえばWikipediaでUNIXを引くと
「概説」の項に以下のように書いてあります。

>各種の周辺装置やある種のプロセス間通信 (IPC) をファイルとして扱う事

ここで、「各種の周辺装置」はキーボードを含みます。

このUNIXのアイディアをMS-DOSが模倣し、Windowsでもそのまま使えるように
なっているわけです。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2058] Re:C言語ポインタ完全制覇 第1版 4-2-1 可変長配列の配列についての質問
返信


投稿者:884
2017/12/18 14:23:31

Link:
ご回答ありがとうございました。理解できました。
こんなにレスポンスが早く、直接、著者より回答がいただけるのは、非常にありがたいです。
[ この投稿を含むスレッドを表示] [ この投稿を削除]