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

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

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

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

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Q&A

解決済

2回答

433閲覧

ファイル読み込みについて

_kei

総合スコア26

C

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

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

0グッド

0クリップ

投稿2021/11/14 10:00

編集2021/11/14 10:26

前提・実現したいこと

ファイル読み込みを行っているコードを読み取りたいです。具体的には、以下のコードです。
アルファベットをつけている行のコードが理解できません。

A...ファイルポインタに、buff のアドレスを代入している。
B...line[line_no++] = buff; ではだめなのか、この行の意味が理解できません。
C...このif文の中で何を行っているのか、さっぱり理解できません。
D...なぜ最後に0 NULLを代入しているのか

どなたか教えていただけますでしょうか。

ソースコード

C

1int main(){ 2 int c; 3 char buff[1000]; 4 char *line[50]; 5 int line_no=0; 6 char *p; 7 int i; 8 FILE *fp; 9 10 p = buff; // A 11 line[line_no++] = p; // B 12 13 fp=fopen("sample.txt","r"); 14 15 while((c=fgetc(fp)) != -1){ 16 *p++ = c; 17 if(c == 0x0a){ // C 18 *p++ = 0; 19 line[line_no] = p; 20 line_no++; 21 } 22 } 23 24 *p = 0; // D 25 fclose(fp); 26 27 return 0; 28}

また、このプログラムは、バッファリングをしているといえるでしょうか。(バッファリングの意味が広すぎてわからないです。)

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

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

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

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

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

guest

回答2

0

あんまり、良いコードとは思えないですが、、、

B...line[line_no++] = buff; ではだめなのか、この行の意味が理解できません。

どちらでも同じ。

C...このif文の中で何を行っているのか、さっぱり理解できません。

入力した文字が改行 ('\n' とも) ならば、です。'\n' == '\x0a' で改行文字のこと。

D...なぜ最後に0 NULLを代入しているのか

C言語では、文字列は 0 ('\x0')で終わります。これが無いと、文字列の終わりが分かりません。

投稿2021/11/14 10:22

pepperleaf

総合スコア6385

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

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

_kei

2021/11/14 10:29

ご回答ありがとうございます。どのあたりを見て良くないコードだと思われたのでしょうか。このコードは、ファイルの中身を表示するコードのようです。改善の余地があれば教えていただけますでしょうか。 また、質問文に追加した質問についてはどのようにお考えでしょうか。 よろしくお願いいたします。
pepperleaf

2021/11/14 12:21 編集

既にコメントがついていますが、プログラムではバッファリングしてません。 ただ、大抵の処理系では、バッファリングされているので、実動作してはバッファリングとなるでしょう。 良くないと思った理由は、 - 一つのバッファ(char buff[1000];)を分割して使っている。 - ++の後置演算子が単独でない箇所があり、慣れない人が間違える。 - 0x0a で比較しているが、文字なので、'\x0A' または、'\n' の方が良いのでは? と言ったところです。まあ、間違いでもなく、意見の分かれるところですが。
_kei

2021/11/14 11:48

なるほど、納得することができました。ご教授いただきありがとうございます。 ベストアンサーを差し上げたいところですが、申し訳ございません。
pepperleaf

2021/11/14 12:25

上記、コメント修正。 > ++の後置演算子が単独でない箇所 これは、一つの式に複数の機能(意味)があると、間違えやすいし、修正ミスになりやすいという事です。 特に、C言語で、マクロ(#define)が使われると、発見が困難です。
guest

0

ベストアンサー

A...ファイルポインタに、buff のアドレスを代入している。

文字型へのポインタpにbuffの先頭アドレスを代入しています。
次の文字入力を行うメモリへのポインタpにbuffの先頭アドレスを設定しています。

B...line[line_no++] = buff; ではだめなのか、この行の意味が理解できません。

だめだはありませんが、Cのline[line_no] = p;と合わせることでコードを理解しやすくしています。

C...このif文の中で何を行っているのか、さっぱり理解できません。

16進数の0x0aつまりLine Feedが来たら、nullコードを書き込むことで文字列を終了させて、次の文字入力を行うメモリへのポインタ、つまりpをlineの次の要素にしています。

D...なぜ最後に0 NULLを代入しているのか

ファイルの最後にLine Feedがない場合でもnullコードを書き込むことで文字列を終了させるためです。

投稿2021/11/14 10:19

ppaul

総合スコア24670

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

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

_kei

2021/11/14 10:30

とても分かりやすい解説をしていただき、ありがとうございます。ベストアンサー とさせていただきたいと思います。 質問文に追加した質問にはどのようにお考えでしょうか。
ppaul

2021/11/14 10:57

バッファリングをしているといえるでしょうか。の答えは「言えません」です。 fgetcがバッファリングしていて、このプログラムはそれを使っているだけです。
_kei

2021/11/14 11:25

fgetcがバッファリングをしていて >>これはどこから分かることでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問