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

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

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

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

Q&A

解決済

2回答

5982閲覧

C言語でメモリの動的確保をしつつ,ファイルの内容を全て読み込む。

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2017/07/25 12:53

C言語でメモリの動的確保を勉強しています。

一旦以下のようなソースを作成しました。
コンパイラはMinGWを使っています。

c

1#include <stdio.h> 2#include <stdlib.h> 3int main () { 4 5 //C言語で文字列を表示 6 char *string = "abcdief"; 7 8 9 // 読み込むファイルパス 10 char *path = "./test.txt"; 11 // 読み込んだ文字列を格納する文字ポインタ 12 char *defaultPointer = NULL; 13 // メモリ領域を確保するポインタ 14 char *temporaryPointer = NULL; 15 // コンパイル時に確保するメモリ領域 16 int getMemorySize = 10; 17 int c; 18 19/* 20 defaultPointer = (char *)malloc(getMemorySize * sizeof(int)); 21 temporaryPointer = (char *)realloc(defaultPointer, getMemorySize * sizeof(int)); 22 defaultPointer = temporaryPointer; 23*/ 24 FILE *fp; 25 fp = fopen(path, "r"); 26 if (fp == NULL) { 27 exit(2); 28 } 29 int i = 0; 30 while (1) { 31 c = fgetc(fp); 32 if (c != EOF) { 33 i = i + 1; 34 } else if (c == EOF) { 35 break; 36 } 37 } 38 39 /* 40 while(true) { 41 if (fgets(defaultPointer, 1 * sizeof(int), fp) != NULL) { 42 i = i + 1; 43 } else { 44 break; 45 } 46 } 47 */ 48 printf("%d", i); 49 fp = fopen(path, "r"); 50 temporaryPointer = (char *)realloc(defaultPointer, i * sizeof(int)); 51 if (temporaryPointer == NULL) { 52 printf("メモリが確保できませんでした。"); 53 } 54 defaultPointer = temporaryPointer; 55 56 fread(defaultPointer,1, sizeof(char)* i, fp); 57// fgets(defaultPointer, i * sizeof(int) + sizeof(int), fp); 58 printf("%s", defaultPointer); 59 free(defaultPointer); 60 free(temporaryPointer); 61 return 0; 62} 63 64

上記のようなファイルをindex.cとし
そのまま同じ内容をファイル名を変更し,test.txtとしました。

上記をコンパイルし実行したところ無事にファイルの中身を全て出力することができましたが
何故か

c

1 2 fread(defaultPointer,1, sizeof(char)* i, fp); 3

上記の箇所を

c

1 2 fread(defaultPointer, sizeof(char)* i, 1, fp); 3

上記のように第二引数と第三引数の順序を変更しても問題なく読み込めてしまいました。
これは引数の順序は問わないということなのでしょうか?

ご教授のほどよろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

昔、某所で同じ議論をしたことがありますが、読み取り結果そのものは、引数の指定順序を入れ替えても同じとのことでした。その他では、freadの戻り値(バイト数ではなく、読み込めた個数を返す為)が変わります。

投稿2017/07/25 13:09

MM98

総合スコア32

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

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

0

ベストアンサー

記憶が確かではありませんが,freadは第2引数が各要素のサイズ,第3引数が要素数だった気がするので,1 byte のデータを i 個読み込むか,i byte のデータを1個読み込むかでバッファリングの挙動が変わるだけで,最終的な動作は同じなのでは?

※試したことがないので,それで動くのかはわかりませんが…

投稿2017/07/25 13:00

編集2017/07/25 13:05
tamy

総合スコア442

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

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

majiponi

2017/07/25 15:14

2*3と3*2の意味の違い、ぐらいなものでしょうか。最終的には同じですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問