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

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

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

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

Q&A

解決済

3回答

1553閲覧

ファイルのサイズを求めるプログラムで、うまくサイズが表示されない

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2017/12/20 05:49

ファイルのサイズを求めるプログラムで実行結果が0と表示されて、
うまくサイズが表示されない。
data_tel.txt は以下のとおりです。
naka 080-7777
kiyoko 090-9999
satou 090-3214
kinosita 080-8679
yamada 090-4325
宜しくお願い致します。

コード #include <stdio.h> #define CAN_CUST_FPOS_TO_LONG 0 #define filename "data_tel.txt" //文字列filenameを文字列"data_tel.txt"に変換します。 #if CAN_CUST_FPOS_TO_LONG unsigend long getFileSize1(const char *filename) { fpos_t fsize; FILE *fp = fopen(fileName, "rb"); fseek(fp, 0, SEEK_END); // fseek関数はファイルポインタの位置を指定した位置に // 移動させることができる関数です。 fgetpos(fp, &fsize);   // ファイルの末尾まで移動させた状態で、ファイルポインタ位置を // 取得するということは、 // そのファイルのファイルサイズそのものを表すことになります。 printf("現在のファイルポインタの位置は「%d」です。\n",fsize); fclose(fp); return (unsigend long) fsize; } #endif /* #ifdef 文 まず、最も良く使われるものが #ifdef 文である。これは以下の ように使う。 #define DEBUG ... #ifdef DEBUG cout << "Debug: hensuu = " << hensuu << endl; #endif つまり、DEBUG というマクロが定義されていたならば、 #ifdef と #endif の間の行が有効になりますが、 もし最初の行の#define DEBUG がなければ、この #ifdef と #endif で 囲まれた行はないものとして プリプロセッサに処理され、 結果として cout 文はコンパイラ から見ると元から無かったようになります。 */ int main(int argc, char *argv[]) { #if CAN_CUST_FPOS_TO_LONG unsigned long size1 = getFileSize1(filename); #else unsigned long size1 = 0; #endif printf("%ld\n", size1); return 0; } /* 実行結果 naka@naka ~/kadai $ gcc -o getFileSize1 getFileSize1.c -Wall naka@naka ~/kadai $ getFileSize1 0 naka@naka ~/kadai $

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

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

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

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

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

guest

回答3

0

ベストアンサー

Linuxでは隙間のあるファイル(Sparse File)を作成することができるため、fseek(2)、及び、ftell(2)を使用して正しいファイルサイズを取得することはできません。
fstat(2)を使用して下さい。

参考:
https://en.wikipedia.org/wiki/Sparse_file
http://www.win.tue.nl/~aeb/linux/lk/lk-6.html
https://www.jpcert.or.jp/sc-rules/c-fio19-c.html

投稿2017/12/20 08:41

hichon

総合スコア5737

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

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

退会済みユーザー

退会済みユーザー

2017/12/22 10:33

とりあえずfstat(2)を使ってファイルサイズを求める関数が出来ましたので、 ありがとうございました。
guest

0

どこかで見た物を、意味がわからないのに真似るのをやめれば、動くようになるかと思います。
自分で書いたプログラムを、読めるようになりましょう。

投稿2017/12/20 06:01

編集2017/12/20 06:02
otn

総合スコア84423

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

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

退会済みユーザー

退会済みユーザー

2017/12/21 22:29

c言語の勉強中なので初心者マークを付けて質問しています。独学なので大目におねがいいたします。 少しずつ何かを得られればいいと思っています。プログラムが作れたら質問はしないと思います。
otn

2017/12/22 00:26

コピペは良いのですが、意味も分からず実行していては、勉強になりません。 コピペしたら読んで理解しましょう。読んで理解できない点があれば、遠慮無く質問してください。
guest

0

CAN_CUST_FPOS_TO_LONG を 0 にしているからっていうオチじゃなくて?

ちなみに CAN_CUST_FPOS_TO_LONG を 1 にすればわかりますがエラーでますので3箇所修正が必要です。

  1. getFileSize1 の型に使われている unsigned のつづりが違う
  2. getFileSize1 が受け取っている引数が filename なのに中で fileName と未定義名参照している
  3. getFileSize1 が返す return のキャストにある unsigned のつづりが違う

投稿2017/12/20 05:54

編集2017/12/20 06:03
HiroshiWatanabe

総合スコア2160

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

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

退会済みユーザー

退会済みユーザー

2017/12/21 22:32

ありがとうございます。fstat()関数を使ってサイズを調べた方がいいということなので、そちらでやってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問