以下のコードは16進数の数値羅列が記述されたテキスト形式のファイルを読み込み、8bitごとの数値を16進数でvector aに格納するコードです。
c++
1#include <fstream> 2#include <iostream> 3#include <sstream> 4#include <string> 5#include <vector> 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::string buf_line; 21 std::vector<int> a; 22 23 while (std::getline(ifs, buf)){ 24 25 std::cout << std::hex << std::showbase << buf << std::endl; 26 std::stringstream ss{buf}; 27 while (std::getline(ss, buf_line, ' ')){ 28 int buf_num = std::stoi(buf_line, nullptr, 16); 29 int up = buf_num >> 8 & 0xff; 30 a.push_back(up); 31 int down = buf_num & 0xff; 32 a.push_back(down); 33 } 34 } 35 std::cout << std::hex << std::showbase << a[16] << std::endl; 36 } 37} 38 39int main(){ 40 read_rom rom; 41 std::string filename = "../test"; 42 rom.fetch(filename); 43} 44 45//読み込んでいるファイル("../test") 467f45 4c46 0101 0100 0000 0000 0000 0000 470300 2800 0100 0000 b125 0000 3400 0000 4854d2 2800 0004 0005 3400 2000 0a00 2800 492b00 2a00 0100 0070 b47e 0200 b47e 0200 50b47e 0200 8008 0000 8008 0000 0400 0000 510400 0000 0600 0000 3400 0000 3400 0000 523400 0000 4001 0000 4001 0000 0500 0000 530400 0000 0300 0000 7401 0000 7401 0000 547401 0000 1900 0000 1900 0000 0400 0000 550100 0000 0100 0000 0000 0000 0000 0000 560000 0000 3887 0200 3887 0200 0500 0000 570000 0100 0100 0000 5090 0200 5090 0300 585090 0300 d00f 0000 e410 0000 0600 0000 590000 0100 0200 0000 209d 0200 209d 0300 60209d 0300 2001 0000 2001 0000 0600 0000 610400 0000 0400 0000 9001 0000 9001 0000
上記のようなテキスト形式ではなく、バイナリ形式のファイルを読み込み、8bitごとの数値を16進数で格納する場合にはどのように記述すれば良いでしょうか。
~~コンパイル時にエラーは無いですが、実行すると以下の画像のよ
うな出力結果となります。
コンパイルコマンドg++ -std=c++14 -g -Og -pipe -Wall
~~
※ascii部分?をうまくコピーできないので、画像で張り付けています。
画像にもありますが、teminateされています。
terminate called after throwing an instance of 'std::invalid_argument'
what(): stoi
お聞きしたい点は2点あります。
terminateされる理由
stoi部分で不正な引数が使用されているとあるようですが、なぜこのようになるのかわかりません。
出力結果
~~出力がasciiになっている(一部のみ?)理由がわかりません。
~~
環境はWindowsで以下の通りです。
$ g++ -v
Using built-in specs.
COLLECT_GCC=C:\MinGW\bin\g++.exe
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/9.2.0/lto-wrapper.exe
Target: mingw32
Configured with: ../src/gcc-9.2.0/configure --build=x86_64-pc-linux-gnu --host=mingw32 --target=mingw32 --disable-win32-registry --with-arch=i586 --with-tune=generic --enable-static --enable-shared --enable-threads --enable-languages=c,c++,objc,obj-c++,fortran,ada --with-dwarf2 --disable-sjlj-exceptions --enable-version-specific-runtime-libs --enable-libgomp --disable-libvtv --with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw --enable-libstdcxx-debug --disable-build-format-warnings --prefix=/mingw --with-gmp=/mingw --with-mpfr=/mingw --with-mpc=/mingw --with-isl=/mingw --enable-nls --with-pkgversion='MinGW.org GCC Build-20200227-1'
Thread model: win32
gcc version 9.2.0 (MinGW.org GCC Build-20200227-1)~~
どなたかご教授ください。以上、よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー