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

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

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

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

2582閲覧

構造体に16進数のリストを格納したい

Grayi

総合スコア26

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/01/21 11:47

編集2020/01/22 13:07

Windowsフォームズアプリケーションでアプリを作っています。環境はVC++です。
16進数のリストが書いてあるファイルを読み込み、構造体にデータを格納したいのですが、方法が思い浮かばず困っています。

以下のような構造体があるとして、

typedef struct { char aaa[56]; char bbb[56]; char ccc[56]; } example;

以下のようなファイルを読み込み、構造体exampleにデータを格納したいです。

0x00,0x01,0x02,0x03,0x04,0x05 0x01,0x01,0x02,0x03,0x04,0x05 0x02,0x01,0x02,0x03,0x04,0x05 0x03,0x01,0x02,0x03,0x04,0x05

このとき、aaaやbbbに一つずつ格納するのではなく、ファイルの先頭から、aaaに限界まで16進数を格納し、aaaがいっぱいになったら次はbbbに16進数を格納する、という方法でデータを格納したいです。

例で表すと、太字部分をaaaに格納した後、
斜体部分をbbbに格納していきたいです。

0x00,0x01,0x02,0x03,0x04,0x05
0x01,0x01,0x02,0x03,0x04,0x05
0x02,0x01,0x02,0x03,0x04,0x05
0x03,0x01,0x02,0x03,0x04,0x05

つたない質問で申し訳ありませんが、どうぞよろしくお願いいたします。

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

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

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

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

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

kazuma-s

2020/01/21 14:23

「aaaに限界まで16進数を格納し、aaaがいっぱいになったら 次はbbbに16進数を格納する」となっています。 aaa も bbb も 56バイトです。 例では、太字部分の 7個の 16進数をを aaaに格納した後、 斜体部分の 7個の 16進数ををbbbに格納しています。 一つの 16進数を格納するのに 8バイト必要だということでしょうか? もっと詳しい説明を追加してください。
Grayi

2020/01/22 13:02

ご指摘ありがとうございます。 16進数は4byteでした。数を数え間違ってしまっていました。 質問を修正します。
kazuma-s

2020/01/22 18:04

「16進数は4byte」とはどういうことでしょうか? 4バイトの整数を 16進数で表すと、0x00000000~0xffffffff です。 例では 0x00~0x05 だけしかなく 1バイトに収まりますが、 例えば、2番目の 0x01 を aaa[4]~aaa[7] に入れるとき、 00 00 00 01 と入れるんですか? それとも 01 00 00 00 と入れるんですか? すでに解決済みだというのなら、そのコードを質問に追記してください。
guest

回答4

0

ベストアンサー

構造体のメンバを気にせず、単純に先頭から埋めていけばいいのでは?
ざっくりなイメージですけど、こんな感じ。

c

1char *p; 2char hex; 3for(p = (char*)&example; p < example + sizeof(example); p++){ 4 hex変数に読み込み 5 EOFならbreak 6 *p = hex 7}

投稿2020/01/22 00:21

ttyp03

総合スコア16996

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

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

Grayi

2020/01/22 13:00

回答ありがとうございます。ttyp03さんに教えていただいた方法で解決することが出来ました! ポインターを使って、先頭から埋めていくことが出来ました。 大変勉強になりました。ありがとうございます。とても助かりました。
guest

0

一緒にコンパイルする・・・てのはダメですか?

c

1char table[] = { 2#include "ファイル名" 3};

で、先頭から構造体に格納。

投稿2020/01/21 15:39

cateye

総合スコア6851

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

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

Grayi

2020/01/22 12:56

こんな方法があるなんて知りませんでした! 残念ながら、今回は作成しているアプリの都合上、ファイルをexeに読み込ませる形になるため、ベストアンサーは他の方を選ばせていただきました。ファイルをexeに読み込ませる、ということをちゃんと質問に書いていなくて申し訳ありません。 大変勉強になります。とても便利そうな方法なので、cateyeさんに教えていただいた方法でも何かコードを書いてみようと思います。本当に回答ありがとうございます。
guest

0

こんにちは。

C++の変数に「16進数」を記録する機能はありません。数値か文字だけです。
一般に16進数は文字(0~9, A~F)で表現されますので文字列として保存することは可能です。

Grayiさんの思いは、カンマで区切られた16進数文字列を数値へ変換してaaa[i]へ保存するのでしょうか?
その場合は、0xを読み飛ばして次の2文字を16進数として数値へ変換してaaa[i]へ保管後 ,や改行を読み飛ばす処理を繰り返すイメージとなります。
16進数文字列を数値へ変換するには、std::stoi()が便利です。

投稿2020/01/21 13:10

Chironian

総合スコア23272

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

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

Grayi

2020/01/22 12:51

こんにちは。回答ありがとうございます。 Chironianさんが教えてくださった方法でコードを書き、16進数文字列を数値に変換しaaa[i]へ保存するところまでは出来ました。しかし、私の力不足で、一つのメンバ変数につき一つの数値を格納することはできたのですが、「メンバ変数に限界までデータを格納してから次のメンバ変数に格納する」ことができませんでした。 今回は他の方の回答方法で問題を解決することができたので、ベストアンサーはその方にすることにしましたが、Chironianさんのおかげでとても勉強になりました。 丁寧に教えてくださってありがとうございます。とても助かりました。
guest

0

16進数のリストを格納しないで、

ファイルの数値をバイトデータに変換して格納していけばよろしい。
16進数のリストが必要なら、そのバイトデータを変換していく、と。

投稿2020/01/21 12:00

y_waiwai

総合スコア87719

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

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

Grayi

2020/01/22 12:46

回答ありがとうございます。 ファイルの数値をバイトデータに変換後、構造体にデータを格納していこうとしたのですが、メンバに格納することはできても、「メンバ変数に限界までデータを格納してから次のメンバ変数に格納する」ことが私の力不足でできませんでした。 他の方の回答方法で問題を解決することができましたが、y_waiwaiさんが教えてくださった方法でもできるように勉強します。 本当に回答ありがとうございます。勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問