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

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

ただいまの
回答率

90.03%

テキストデータをバイナリデータに変換 C言語

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 3,761

ccccididid

score 20

テキストデータをバイナリデータに変換するプログラムを作成しているのですが
うまくいきません

テキストデータをfopenの"r"モードで読み込み
その後
fopenの"wb"モードで作成したファイルに書き込む

このような手法をとっているのですがアドバイス頂きたいです

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • Zuishin

    2018/10/14 20:57

    それをそのまま保存しても画像にはなりませんよ。記述の見方がわかるようになるのが先では?

    キャンセル

  • asm

    2018/10/15 10:09

    50*50の小数が並んでるテキストから50*50のグレイスケール画像を作りたいという事?

    キャンセル

  • fana

    2018/10/15 12:01

    その"画像処理ソフト"とやらが入力として扱える形式に「画素値として浮動小数点数を取れる何らかのフォーマット」が存在するのか否か?→(1)存在するならば,そのフォーマットに関する具体情報が必要,(2)存在しないならば,扱える形式にデータを変換する必要があるがその際の「妥当な変換って何?」というのは,行われる「解析」の都合次第なので,そこを具体的に説明する必要がある.

    キャンセル

回答 4

+1

... テキストデータをバイナリデータに変換 ...

テキストデータもバイナリーデータです。
rb モードで書き込んでも本質的にはなにも変わりません。

参考情報

...
全てのファイルは本質的にはバイナリファイルです。
バイナリを直訳すると、2進数という意味なのですが、
バイナリファイルとはその名の通り、2進数で記録されたファイル、
要するに、数値のみで記録されたファイルのことを意味します。

それに対して、テキストファイルは、文字列だけが記録されたファイルです。
コンピュータの中では、文字列といえども数値で表されているので、
テキストファイルも、本質的にはバイナリファイルです。
...

...
テキストファイルをテキストエディタで確認できるように、バイナリファイルは、バイナリエディタを使って確認できます。
...

どんな入力ファイルに対して、どんな出力ファイルを得たいのかの具体例を提示してみてください。
そうすれば、いろいろ回答が投稿されると思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

その「画像処理ソフト」がどんな形式のデータを受け入れるのか詳細な仕様を貼ってもらわなければ誰も答えられません。
浮動小数点数のバイナリ形式だけでも色々な種類があります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/16 20:30

    多分、double か、float そのままで良いのでは?
    ちょっと簡単に作ってみようと思ったが、時間が無い...

    キャンセル

checkベストアンサー

0

もしかして以下のような事でしょうか?

  // 以下、イメージです。不足(手抜き)箇所多数
  FILE *textFile = fopen("TextFile", "r");
  FILE *binFile = fopen("BinaryFile", "wb");

  double data;
  while (fscanf(textFile, "%f", &data) > 0) {
    fwrite(&data, sizeof(double), 1, binFile);
  }

テキストファイルから、読み込んで、バイナリファイルへの書込みとなります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

以下の手順でテキストファイルをバイナリ形式で保存できます。

 手順 (Python)

  1. numpy.loadtxt() でテキストファイルを読み込み。
  2. ndarray.tofile() でバイナリ形式で保存する。(row-major-order)

 サンプルコード

50行50列の数値データが書き込まれた CSV ファイルを読み込み、バイナリ形式で保存します。(row-major-order)

import numpy as np

# テスト用データ作成 (50行50列でスペース区切り)
data = np.random.randn(50, 50)
np.savetxt('data.csv', array, delimiter=' ')

# ファイルを読み込む。
data = np.loadtxt('data.csv')
print(data.shape, data.dtype)  # (50, 50) float64

# バイナリ形式で保存 row-major-order で書き込まれます。
data.tofile('data.binary')

# バイナリ形式で保存できたか、確認する。
with open('data.binary', 'rb') as f:
    d = f.read()
    print('bytes of data.binary', len(d))  # bytes of data.binary 20000
    # Python の float 型は 8bytes  (倍精度) なので、4 * 50 * 50 = 20000

 C++

すいません。タイトルを見てませんでした。
「画像処理ソフトの入力データを作る」が目的であれば、言語はなんでもよいと思いますが、C++ のサンプルコードも貼っておきますね。
(C言語は面倒なので、省略します。すいません。)

#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

/**
 * @brief 指定したパスからデータを読み込む。
 * @param filepath ファイルパス
 * @param data 読み込んだデータ
 */
void readTxtData(
    const std::string &filepath, std::vector<std::vector<double>> &data)
{
    data.clear();
    std::ifstream ifs(filepath);

    std::string line;
    while (std::getline(ifs, line)) {
        if (line.empty())
            continue;
        std::vector<double> rowData;
        std::stringstream lineStream(line);

        double value;
        while (lineStream >> value) {
            rowData.push_back(value);
        }

        data.push_back(rowData);
    }
}

/**
 * @brief 指定したパスにデータを書き込む。
 * @param filepath ファイルパス
 * @param data 読み込んだデータ
 */
void writeData(
    const std::string &filepath, const std::vector<std::vector<double>> &data)
{
    std::ofstream ofs(filepath, std::ios::out | std::ios::binary);
    for (const auto &rowData : data) {
        for (const auto &v : rowData)
            ofs.write(reinterpret_cast<const char *>(&v), sizeof(v));
    }
}

int main()
{
    // データを読み込む。
    std::vector<std::vector<double>> data;
    readTxtData("data.csv", data);

    // データを表示する。
    for (const auto &rowData : data) {
        for (const auto &v : rowData)
            std::cout << v << " ";
        std::cout << std::endl;
    }

    writeData("data.binary", data);
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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