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

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

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

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

Q&A

1回答

1621閲覧

C++でのファイル読み込みについて

ddp

総合スコア17

C++

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

0グッド

0クリップ

投稿2020/07/24 03:29

以下のコードにて16進数のデータファイルを読み込み、1バイトずつデータを配列aに格納したいです。

c++

1#include <fstream> 2#include <iostream> 3#include <string> 4#include <vector> 5//using namespace std; 6 7class read_rom{ 8public: 9 int rom_data; 10 void fetch(std::string filename); 11}; 12 13void read_rom::fetch(std::string filename){ 14 std::ifstream ifs(filename); 15 16 if (!ifs){ 17 std::cout << "Error! File can not be opened" << std::endl; 18 }else{ 19 std::string buf; 20 std::vector<int> a; 21 int n = 0; 22 while (std::getline(ifs, buf, ' ')){ 23 24 std::cout << std::hex << std::showbase << buf << std::endl; 25 // std::cout << std::hex << std::showbase << buf << std::endl; 26 int buf_num = std::stoi(buf, nullptr, 16); 27 int up = buf_num >> 8 & 0xff; 28 a.push_back(up); 29 int down = buf_num & 0xff; 30 a.push_back(down); 31 } 32 std::cout << std::hex << std::showbase << a[16] << std::endl; 33 34 } 35 36 37} 38 39int main(){ 40 read_rom rom; 41 std::string filename = "test"; 42 rom.fetch(filename); 43} 44

データファイル"test"は以下のものを使用しています。

test

1c506 004f 09c1 c900 c321 09e1 d1c1 f1c9 2c3d9 00f2 1600 0000 c380 ff00 0000 0000 3c319 0800 0000 0000 f3cd b104 d900 0000 4c301 0700 0000 0000 c338 0000 0000 0000 5c303 c700 0000 0000 c306 c787 8787 8787 687c9 2929 2929 2929 29c9 2929 2929 2929 72909 c929 2929 2929 2929 19c9 af22 0520 8fcc9 aff5 d55f 7323 0b79 b020 f9d1 f1c9

std::cout << std::hex << std::showbase << a[16] << std::endl; の部分で要素数16を出力しているのですが、
testファイルのc3d9が格納されておらず、00が出力されます。
a[17]ではf2が出力されます。

どうも2行目以降の1バイト目が処理されずスルーされているようなのですが、原因がわかりません。
どなたかご教授よろしくお願いいたします。

環境
Windows10 WSL Ubuntu
コンパイラ:g++ 9.3.0

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

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

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

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

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

guest

回答1

0

自己解決しました。

c++

1while (std::getline(ifs, buf)){ 2 3 std::cout << std::hex << std::showbase << buf << std::endl; 4 std::stringstream ss{buf}; 5 while (std::getline(ss, buf_line, ' ')){ 6 int buf_num = std::stoi(buf_line, nullptr, 16); 7 int up = buf_num >> 8 & 0xff; 8 a.push_back(up); 9 int down = buf_num & 0xff; 10 a.push_back(down); 11 } 12 }

投稿2020/07/24 03:42

ddp

総合スコア17

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問