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

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

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

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

Q&A

解決済

4回答

16391閲覧

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

ccccididid

総合スコア23

C

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

0グッド

0クリップ

投稿2018/10/14 10:33

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

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

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

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

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

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

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

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

otn

2018/10/14 10:40

具体的にどういうデータをどういうデータに変換したいのですか?
ccccididid

2018/10/14 10:48

float型で50×50に並んでるものをバイナリデータに変換したいです
otn

2018/10/14 10:54

いや、だから、具体的に。
ccccididid

2018/10/14 11:15

テキストデータはfloat型で50×50(2500個)のデータがあります(このテキストデータはセルシウス度表記の温度データです) このテキストデータを画像処理ソフトで解析するために同じ並びで格納されているバイナリデータが必要なために変換する必要があります
Zuishin

2018/10/14 11:20

テキストデータに float 型というのはありません。
ccccididid

2018/10/14 11:23

すみません 小数点以下6桁の値です
otn

2018/10/14 11:33

話が通じないので、別の聞き方をします。その画像処理ソフトの入力データについて書かれている記述をそのまま質問に追記してください。
退会済みユーザー

退会済みユーザー

2018/10/14 11:36

その値がテキスト上どう並んでいるのかが見えないから、具体的にと言われているんだと思います。テキストデータ上どう並んでいるかの仕様、もしくは記載例がほしいです。
ccccididid

2018/10/14 11:43

5.666824 1.585226 ・・・・・ 左のような形で50行50列で並んでいます 画像処理ソフトの入力データについて書かれている記述の見方がわからないため間違えているかもしれませんが tiffやjpeg,拡張子のついていないデータなどを読み込んでくれます
Zuishin

2018/10/14 11:57

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

2018/10/15 01:09

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

2018/10/15 03:01

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

回答4

0

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

手順 (Python)

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

サンプルコード

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

python

1import numpy as np 2 3# テスト用データ作成 (50行50列でスペース区切り) 4data = np.random.randn(50, 50) 5np.savetxt('data.csv', array, delimiter=' ') 6 7# ファイルを読み込む。 8data = np.loadtxt('data.csv') 9print(data.shape, data.dtype) # (50, 50) float64 10 11# バイナリ形式で保存 row-major-order で書き込まれます。 12data.tofile('data.binary') 13 14# バイナリ形式で保存できたか、確認する。 15with open('data.binary', 'rb') as f: 16 d = f.read() 17 print('bytes of data.binary', len(d)) # bytes of data.binary 20000 18 # Python の float 型は 8bytes (倍精度) なので、4 * 50 * 50 = 20000

C++

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

cpp

1#include <fstream> 2#include <iostream> 3#include <sstream> 4#include <string> 5#include <vector> 6 7/** 8 * @brief 指定したパスからデータを読み込む。 9 * @param filepath ファイルパス 10 * @param data 読み込んだデータ 11 */ 12void readTxtData( 13 const std::string &filepath, std::vector<std::vector<double>> &data) 14{ 15 data.clear(); 16 std::ifstream ifs(filepath); 17 18 std::string line; 19 while (std::getline(ifs, line)) { 20 if (line.empty()) 21 continue; 22 std::vector<double> rowData; 23 std::stringstream lineStream(line); 24 25 double value; 26 while (lineStream >> value) { 27 rowData.push_back(value); 28 } 29 30 data.push_back(rowData); 31 } 32} 33 34/** 35 * @brief 指定したパスにデータを書き込む。 36 * @param filepath ファイルパス 37 * @param data 読み込んだデータ 38 */ 39void writeData( 40 const std::string &filepath, const std::vector<std::vector<double>> &data) 41{ 42 std::ofstream ofs(filepath, std::ios::out | std::ios::binary); 43 for (const auto &rowData : data) { 44 for (const auto &v : rowData) 45 ofs.write(reinterpret_cast<const char *>(&v), sizeof(v)); 46 } 47} 48 49int main() 50{ 51 // データを読み込む。 52 std::vector<std::vector<double>> data; 53 readTxtData("data.csv", data); 54 55 // データを表示する。 56 for (const auto &rowData : data) { 57 for (const auto &v : rowData) 58 std::cout << v << " "; 59 std::cout << std::endl; 60 } 61 62 writeData("data.binary", data); 63}

投稿2018/10/14 12:31

編集2018/10/14 12:55
tiitoi

総合スコア21956

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

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

0

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

投稿2018/10/14 12:24

hichon

総合スコア5737

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

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

pepperleaf

2018/10/16 11:30

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

0

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

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

参考情報

  • バイナリファイルの読み書き

https://9cguide.appspot.com/17-02.html

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

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

  • バイナリファイルの読み書き

https://programming-place.net/ProgrammingPlacePlus/c/042.html

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

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

投稿2018/10/14 12:04

編集2018/10/14 12:11
katoy

総合スコア22324

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

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

0

ベストアンサー

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

C

1 // 以下、イメージです。不足(手抜き)箇所多数 2 FILE *textFile = fopen("TextFile", "r"); 3 FILE *binFile = fopen("BinaryFile", "wb"); 4 5 double data; 6 while (fscanf(textFile, "%f", &data) > 0) { 7 fwrite(&data, sizeof(double), 1, binFile); 8 }

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

投稿2018/10/16 13:32

pepperleaf

総合スコア6383

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問