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

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

ただいまの
回答率

90.83%

  • C

    3344questions

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

  • バイナリ

    19questions

C言語のfreadでEOF(0x1A)を検知した時点でバッファへの読み込みを終えないようにしたい。

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 173

 前提・実現したいこと

・前提
C言語をあまり普段使用しないが、必要だったのでC言語で実現したいと考えている。

・やりたいこと
stat構造体を使用してファイルサイズを取得。
取得後、ファイルサイズのバッファを作成し、freadで読み込む。

 発生している問題・エラーメッセージ

size > size2で終了してしまうことである。
size == size2でファイル分のバイナリデータを読み込みたい。

 該当のソースコード

struct stat stbuf;
FILE *fIn; // 代入済み

int fd = open(fileInName, O_RDONLY);
fstat(fd, &stbuf);
unsigned long size = stbuf.st_size; // sizeはバイナリエディタで確認したバイト数と同じであった。

unsigned char bin[size]; 
// ここでsize > size2(0x1Aで読み込みを終了してしまう。)
unsigned long size2 = fread(bin, sizeof(unsigned char), size, fIn);

 試したこと

unsigned charの部分をintに変えたりしていたが同じ箇所で読み込みが止まってしまう。

 補足情報(FW/ツールのバージョンなど)

コンパイラはWindowsPowerShellでgccコンパイラを使用している。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+4

バイナリーモードはオープン時に指定しないと意味ないです。fdopenFILE構造体を作るだけで、OS的な意味でオープンするわけじゃ無いので。

int fd = open(fileInName, O_RDONLY|O_BINARY);

b は実装依存って。。

なお、Unix/Linuxの場合は常にWindowsで言うところのバイナリーモードです。なので"b"の有無は関係ありません。O_BINARYという定数も存在しません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/04 00:55

    ああ、デフォルトはバイナリモードで、bの有無は関係ないってことなのね

    キャンセル

  • 2018/06/04 01:31

    なるほど、DOS/Windows版の方が”b”でDOS/Windows側のバイナリモードを意味させていて、
    テキストモードではPOSIX側に寄せていると考えるとつじつまが合いますね。

    キャンセル

  • 2018/06/04 02:07

    CP/Mも改行はCRLFですが、この時代にはテキストモードが無かったので、
    テキスト処理時には、ユーザープログラムで '\r' を読み飛ばしたり、
    while((ch=getc(fp))!=EOF&&ch!=0x1A){
    みたいなことしてたと思います。
    MS-DOS時代になって、いつのまにかテキストモード・バイナリーモードの区別が出来ていました。

    キャンセル

  • 2018/06/04 08:47

    otnさん、追加のコメントどうもありがとうございます。DOS/Windows版fopenのバイナリモードでの改行の扱いについて長年疑問に思っていたのですが、回答とコメントでCP/M時代からの経緯が分かり、疑問が氷解しました。

    キャンセル

checkベストアンサー

0

Fin はどのようにオープンしているのでしょうか?
バイナリモードでオープンしていないと、テキスト以外は、色々と変換されます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/03 23:00

    int fd = open(fileInName, O_RDONLY);
    if (fd == -1){
    exit(EXIT_FAILURE);
    }
    if ((fpIn = fdopen(fd, "rb")) == NULL) {
    exit(EXIT_FAILURE);
    }
    で開いています。

    キャンセル

  • 2018/06/03 23:11

    お使いのOSとランタイムが何かわかりませんが、fdopenにおける”b”指定はPOSIX準拠システムでは無視されるそうです。https://linuxjm.osdn.jp/html/LDP_man-pages/man3/fopen.3.html

    キャンセル

  • 2018/06/03 23:21

    うわーーーなるほど!
    ありがとうございます!

    fopenでもう一度他に読み込みをやるか、他の方法を取るべきですね。

    キャンセル

  • 2018/06/03 23:28 編集

    ※pepperleafさんの回答への突然のコメントにて、大変失礼しました。
    manページ自体はfdopenのみならず、fopen, freopenに関するものなので、それら全てに言えることだとも思えます。注意してみてください。

    キャンセル

  • 2018/06/03 23:36

    えーー
    なんじゃそりゃ。
    b は実装依存って。。

    キャンセル

  • 2018/06/04 15:42

    otnさんのバイナリ指定と、
    y_waiwaiさんのfopenでやってみては
    という意見を受けてやり直したところ、両者ともにwindowsで正常に動作することを確認できました。
    また、dodox86の意見でバグの原因がわかりました。
    皆さんありがとうございました。

    キャンセル

0

バイナリモードでオープンしてみよう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/03 23:01

    バイナリモードのはずなんですが...

    キャンセル

  • 2018/06/03 23:03

    1AでEOFになるのはテキストモードの仕様ですね
    もいちど確認してみては。

    キャンセル

  • 2018/06/03 23:07

    fdopen じゃなくて、fopenではどうなるかやってみては

    キャンセル

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

  • ただいまの回答率 90.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    [C#]関数を配列でまとめたい

    関数を配列でまとめて、それをindexで呼び出すみたいなことをしたいのですが、 関数を配列にまとめるにはどうしたらよいでしょうか?

  • 解決済

    strict aliasing ruleについて

    x64のWindows上でCプログラミングをしている途中に、mallocで確保してunsigned long(Windowsでは32ビット)の配列として値を詰め込んだ領域を、uns

  • 解決済

    バイナリファイルと16進文字列への相互変換について

    画像をバイナリとして開いたのちにそのバイナリ列と16進文字列を相互変換するプログラムを書いています。ここで問題なのが、バイナリ列から16進文字列への変換をしたのち、再びバイナリ列に

  • 受付中

    C:大きな数の計算方法,オーバーフロー回避

    C言語で3^80の計算をしたいのですが、数が大きすぎてオーバーフローしてしまいます。各桁ごとに配列を置けばいいのかとも思いましたが、いまいちよくわかりません。 解決方法が分かる方

  • 解決済

    MQL4(メタトレーダー4)からMySQLに接続できない

    やりたい事 メタトレーダー4からMySQLに接続したい 使用ツール MySQL 5.7.18 Connector/C 6.1.10 MT4 MetaEditor(下記コードの

  • 解決済

    fscanfがうまく動作しない

    前提・実現したいこと テキストファイルから情報を取り込みたい。 中身は Dbrenlhsij,11,162.2,55.9 Ijnpwthy,14,163.8,62.6 Csaztv

  • 解決済

    [C++からC#に書き直す] メモリの動的確保の方法

    前提・実現したいこと ・問題点 Visual StudioでC#とWPFを使ったアプリケーションを作っています。 入力した画像を細線化させるためにメモリの動的確保を行ったソースコー

  • 解決済

    C⇒pythonへのコンバート方法

     前提・実現したいこと Pyhton初心者です。 該当ソースは、C言語で作成されているのですが、pythonへコンバートした際の記述が不明な為、ご教授をお願いいたします。 主に「f

同じタグがついた質問を見る

  • C

    3344questions

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

  • バイナリ

    19questions

  • トップ
  • Cに関する質問
  • C言語のfreadでEOF(0x1A)を検知した時点でバッファへの読み込みを終えないようにしたい。