全体ロードマップ インターネット電話 音の符号化 ( 信号処理 ) 今日 音の録音 再生 ネットワーク ( ソケット ) プログラミング ファイル入出力 インターネットの基礎 C プログラミング基礎

Similar documents
ファイル入出力

ファイル入出力

slide4.pptx

Taro-ファイル処理(公開版).jtd

Microsoft Word - Cプログラミング演習(9)

Microsoft PowerPoint - prog04.ppt

02: 変数と標準入出力

PowerPoint Presentation

PowerPoint プレゼンテーション

02: 変数と標準入出力

Microsoft PowerPoint - 第3回目.ppt [互換モード]

gengo1-12

gengo1-12

情報処理演習 B8クラス

Microsoft PowerPoint - 14th.ppt [互換モード]

計算機プログラミング

2006年10月5日(木)実施

演算増幅器

gengo1-12

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

※ ポイント ※

PowerPoint Presentation

Prog1_12th

Microsoft PowerPoint - kougi2.ppt

Microsoft Word - Cプログラミング演習(10)

Microsoft PowerPoint - prog06.ppt

Microsoft PowerPoint - kougi6.ppt

PowerPoint プレゼンテーション

memo

FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作り

ファイル入出力と プロセス間通信 \(1\)

Microsoft PowerPoint pptx

C言語講座 ~ファイル入出力編~

Microsoft PowerPoint - kougi9.ppt

Microsoft PowerPoint - CproNt11.ppt [互換モード]

プログラミング基礎

C言語におけるファイル入出力の高速化

ポインタ変数

フィルタとは

C言語入門

Microsoft PowerPoint - kougi4.ppt

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

Microsoft PowerPoint - 10Com2.ppt

memo

PowerPoint プレゼンテーション

Microsoft PowerPoint - prog03.ppt

ゲームエンジンの構成要素

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

1 C STL(1) C C C libc C C C++ STL(Standard Template Library ) libc libc C++ C STL libc STL iostream Algorithm libc STL string vector l

C プログラミング 1( 再 ) 第 4 回 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 1

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

ポインタ変数

ポインタ変数

Cプログラミング1(再) 第2回

Microsoft PowerPoint pptx

データ構造

文字列 2 前回の授業ではコンピュータ内部での文字の取り扱い 文字型の変数 文字型変数への代入方法などを学習した 今回は 前回に引き続き 文字処理を学習する 内容は 標準入出力 ( キーボード ディスプレイ ) での文字処理 文字のファイル処理 文字を取り扱うライブラリ関数である 標準入出力 Lin

Microsoft PowerPoint - kougi8.ppt

memo

PowerPoint プレゼンテーション

memo

テキスト処理第 2 回 田中哲産業技術総合研究所情報技術研究部門 akira/textprocess/

ファイル入出力と プロセス間通信 \(2\)

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

Microsoft Word - no103.docx

プログラミング実習I

Microsoft PowerPoint - guidance.ppt

ファイルシステム

プログラミング及び演習 第1回 講義概容・実行制御

PowerPoint プレゼンテーション

基礎プログラミング2015

プログラミング演習3 - Cプログラミング -

02: 変数と標準入出力

デバッグの工夫

プログラミング演習3 - Cプログラミング -

A/B (2018/10/19) Ver kurino/2018/soft/soft.html A/B

格子点データの解析 1 月平均全球客観解析データの解析 客観解析データや衛星観測データのような格子点データは バイナリ形式のデータファイルに記録されていることが多いです バイナリ形式のデータファイルは テキスト形式の場合とは異なり 直接中身を見ることができません プログラムを書いてデータを読み出して

第1回 プログラミング演習3 センサーアプリケーション

Microsoft PowerPoint ppt

slide5.pptx

1. ファイルにアクセスするには ファイルにアクセスするには 1. ファイルを開く 2. アクセスする 3. ファイルを閉じるという手順を踏まなければなりません 1.1. ファイルを読み込む まずはファイルの内容を画面に表示させるプログラムを作りましょう 開始 FILE *fp char fname

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Microsoft PowerPoint - adi05.ppt [互換モード]

: CR (0x0d) LF (0x0a) line separator CR Mac LF UNIX CR+LF MS-DOS WINDOWS Japan Advanced Institute of Science and Technology

メモリ管理

スライド タイトルなし

Prog1_10th

TFTP serverの実装

Microsoft PowerPoint - kougi7.ppt

AquesTalk プログラミングガイド

Microsoft PowerPoint - prog03.ppt

Microsoft PowerPoint - 5Chap15.ppt

プログラミング及び演習 第1回 講義概容・実行制御

ソフトウェア基礎 Ⅰ Report#2 提出日 : 2009 年 8 月 11 日 所属 : 工学部情報工学科 学籍番号 : K 氏名 : 當銘孔太

PowerPoint プレゼンテーション

Microsoft Word - no15.docx

プログラミング実習I

Transcription:

ファイル入出力

全体ロードマップ インターネット電話 音の符号化 ( 信号処理 ) 今日 音の録音 再生 ネットワーク ( ソケット ) プログラミング ファイル入出力 インターネットの基礎 C プログラミング基礎

今日のロードマップ 波形として可視化 (gnuplot) 課題 2.13, 2.15 音を自分のプログラムに読み込む (rec + read) 音を作って鳴らす (write + play) 課題 2.14, 2.16 C でファイル 標準入出力 (open, write, read, close) sox コマンドで録音 (rec) 再生 (play) 音がデータの列としてどう表されているのか ( 符号化 ) を理解特に, Linear PCM (raw 形式 ). 標本化周波数, 量子化 bit 数, チャネル数

ファイル入出力の流れ 書き込み, 作成 open; write ( 任意回 ); close 読み込み open; read ( 任意回 ); close man -s 2 open ( または read, write, close) で必要な #include, 引数の意味などを調べてみよ

書き込み 作成 int fd = open(filename, O_WRONLY O_CREAT O_TRUNC, 0644); m = write(fd, data, n); close(fd); 確かに filename を開いたよという 印 ( 切符 ) ファイルディスクリプタ. 実体はただの整数 (3, 4, 5,...) 書きたいバイト数配列 ( ポインタ ; アドレス ) 実際に書けたバイト数もしくはエラー発生時は -1

新たな超重要注意 : 右を見て左を見 て, また右を見て... システム関数の呼び出しは 失敗するもの と思って書く 呼び出したら成功を確認してから先へ進む 絶対駄目 : int fd = open(filename,...); write(fd,...,...); ないよりマシ : int fd = open(filename,...); if (fd == -1) { printf( gaan\n ); exit(1); } 推奨 : int fd = open(filename,...); if (fd == -1) { perror( open ); exit(1); }

おすすめスタイル 一度だけ書いておく ; こんだけ! void die(char * s) { perror(s); exit(1); } 何かあったらすぐ die NG: int fd = open(...); OK: int fd = open(...); if (fd == -1) die( open ); エラー時には errno をセットする 関数 (man を見よ ) は, エラー直後に perror を呼べば有用情報が表示される

読み込み int fd = open(filename, O_RDONLY); m = read(fd, data, n); close(fd); 書きたいバイト数 n バイト以上ある配列 ( ポインタ ; アドレス ) 実際に書けたバイト数 ( エラー時は -1)

何を書いているか 誤解なきよう 以下の違い 同じが区別できるように char a[4] = { 1, 2, 3, 4 }; write(fd, a, 4); char a[4] = { '1', '2', '3', '4' }; write(fd, a, 4); char * a = 1234 ; write(fd, a, 4); int a[4] = { 1, 2, 3, 4 }; write(fd, a, 4); fprintf(fp, %d, 1234);

概念整理 ( ファイルの中身 ) コンピュータは全てを 0/1 (bit) で表すんだって! 通常, 最低でも 8 つの bit ( 普通これを 1 byte と呼ぶ ) を一まとめにして扱う (16, 32, 64 bit などの場合もある ) いいかえればすべてのファイルは byte (256 種類のデータ ; 0-255 のどれか ) がずらーっと並んだ物 -128 127 のどれかと思ったりする場合もあり, 2 バイトずつまとめて 0-65535 の列と思ったり, 都合に応じて 解釈 は変わる

混乱したら数字しか世の中にないと思 うが吉 あえて標語的に言えば 文字列, 文字などというものは存在しない 'a' じつは 49 のこと (ascii 符号 ) abc じつは { 49, 50, 51, 0 } のこと 数字データ ( または バイト列 ) しか世の中にはなく, それ以外のものはその バイト列 の解釈方法 ( 符号化 ) によって作られている幻想? に過ぎないと思っておけば良い

以下の違い 同じが区別できるように char a[4] = { 1, 2, 3, 4 }; write(fd, a, 4); char a[4] = { '1', '2', '3', '4' }; write(fd, a, 4); 実は char a[4] = { 49, 50, 51, 52 }; と同じ char * a = 1234 ; write(fd, a, 4); 上と同じ int a[4] = { 1, 2, 3, 4 }; write(fd, a, 4); char a[16] = {1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0} と同じ実際に書かれるのは, {1,0,0,0} まで ( あくまで 4 バイト ) fprintf(fp, %d, 1234); 2,3 番目の例と同じ (fprintf の中でややこしい変換している )

od (octet dump) コマンド ファイル中の バイト列 を読める数字の列で表示してくれるコマンド 基本 : od -t u1 ファイル名でファイルの各バイトを 0 255 で表示する char a[4] = { 1, 2, 3, 4 }; 1 2 3 4 char a[4] = {'1','2','3','4'}; 49 50 51 52 1234 49 50 51 52 int a[4] = { 1, 2, 3, 4 } 1 0 0 0 2 0 0 0 オプションしだいで 2 バイト一組, 4 バイト一組,, 符号あり なしなどでの表示も可能

補足 : fopen, fwrite, fread, fclose open; write/read; close の代わりに, fopen, fwrite/fread, fclose という関数もある

fopen を用いたファイル作成 FILE * fp = fopen(filename, w ); m = fwrite(data, s, n, fp); fclose(fp); 確かに filename を開いたよという 印 ( 切符 ) ファイル構造体 書きたいバイト数 ( 要素サイズ s x 要素数 n) 配列 ( ポインタ ; アドレス ) 実際に書けた要素数

両者の違い Unix においては, open/read/write が, the プリミティブ (OS のシステムコール ) fopen は open, fread は read, を使っているだけ ユーザから見た違い 多くの目的は当然どちらでも達成できる. 混ぜるなキケン とだけ覚えておけば良い fopen 系には気の利いた機能もある fgets ( 改行まで読む ), fprintf ( 書式付き出力 ), fscanf fopen を使いたくない理由は バッファリング

バッファリング fwrite write だが, write : その場で即 OS に 書け fwrite : 少しデータがたまったところで一括して write 普段はありがたい機能 (write を呼ぶオーバーヘッドを低減 ) 一方 fwrite で 書いたつもりなのにデータがファイルに反映されない, 音がすぐにならない などの問題はバッファリングが原因になることもある

標準入出力, リダイレクト, パイプ 標準入出力 open しなくても 最初からある ファイルディスクリプタ リダイレクト 自分で open しなくても, シェルがファイルを開いて標準入出力にしてくれる パイプ 自分で open しなくてもシェルが, 自分の標準入 ( 出 ) 力と, 他のプロセスの標準出 ( 入 ) 力を結んでくれる

標準入出力 ファイルディスクリプタ 0, 1, 2 のこと 0 : 標準入力 1 : 標準出力 2 : 標準エラー出力 つまり以下は, open もせずにいきなりやってよい m = read(0, data, n); m = write(1, data, n); m = write(2, data, n);

それぞれ何なのか? 普通は, 標準入力 : 端末からのキーボード入力標準出力 : 端末への出力標準エラー出力 : 端末への出力 つまり, read(0, data, n) キーボードから読む write(1, data, n) 端末へ書く write(2, data, n) 端末へ書く

リダイレクト シェルの機能 $ コマンドライン > filename と書くだけで コマンドライン の標準出力を filename にしてくれる 標準入力 $ コマンドライン < filename 標準エラー出力 ( あまり使わない ; エラーメッセージを保存したい時とか ) $ コマンドライン 2> filename

パイプ シェルの機能 $ コマンドライン コマンドライン ' とかくだけで, コマンドライン の標準出力を コマンドライン ' の標準入力へつなげてくれる コマンドライン write(1,...) read(0,...) コマンドライン ' パイプ

どれも Unix の地味だが偉大な発明 ファイルディスクリプタの概念 入出力先がなんであっても ( ファイル, キーボード, 端末, パイプ, ネットワーク ), write/read を使えば良い リダイレクト 必要に応じてあちらに書いたりこちらに書いたり, というアプリが簡単に書ける 標準入出力を使えばその あちらやこちら を自分で書く必要すら無い ( 簡単かつ汎用化できる ) パイプ 単機能なプログラムを組み合わせて高機能を作り出せる 単機能 : 再利用しやすい, デバッグしやすい

本実験におけるパイプ 後に, sox という録音再生ツールと, 自分で作るプログラムをパイプでつないで電話を作る さしあたり 録音再生 は sox コマンドにまかせる $ 録音コマンド 自分の電話プログラム 再生コマンド sox におまかせ

補足 : fopen 系の標準入出力 もちろん正体は同じものだが, ファイルディスクリプタ (int) とファイル構造体 (FILE *) の表面上の違いから, 見た目が異なる 標準入力 : stdin 標準出力 : stdout 標準エラー出力 : stderr よって例えば fwrite(data, s, n, stdout)» write(1, data, s*n) fread(data, s, n, stdin)» read(0, data, s*n)