ファイル操作 さんが書きました:
コード:
ifs >> iID >> zName >> zType >> iPrice >> zComment;
あとこれって何をしているんですか?
ファイルから読み込む文字列をホワイト スペース (タブ、半角スペース、改行 など)毎に区切って単語とし、split(分割)しています。
">>"毎に次のホワイトスペースまでの文字列を右辺の変数に代入します。
その際、代入先の変数の型をコンパイル時に認識済みなため、型変換が自動で行われ数字は数値型へも代入可能となっています。
ファイル操作が分からなかったため、コード自体が何をしているか分からなかったのでしょうか?
SQLiteの関数をできるだけ掲載した同等のコードを載せておきます。
エラー処理は省いています。
各関数とエラー処理についてはご自身で勉強してください。
[環境]Windows7, VS2013update3, SQLite3(sqlite-amalgamation-3080500)
コード:
#pragma comment(lib, "sqlite3.lib")
#include "sqlite3.h"
#include <iostream>
#include <fstream>
#include <string>
#include <regex>
#include <vector>
using namespace std;
vector<string> split(const string& s, regex&& pattern) {
sregex_token_iterator first(begin(s), end(s), pattern, -1);
sregex_token_iterator last;
return vector<string>(first, last);
}
int main()
{
//DBのオープン
sqlite3 *ItemDB;
sqlite3_open_v2("game.db", &ItemDB, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, nullptr);
//テーブルの作成
char* errMsg = NULL;
//string sql_create = "CREATE TABLE ItemTable ("
// " ID INTEGER PRIMARY KEY,"
// " Name TEXT NOT NULL,"
// " Type TEXT NOT NULL,"
// " Price INTEGER NOT NULL,"
// " Comment TEXT )";
//sqlite3_exec(ItemDB, sql_create.data(), 0, 0, &errMsg);
//sqlite3_free(errMsg);
//SQLの作成
string sql = "INSERT INTO ItemTable ( ID, Name, Type, Price, Comment ) values( ?, ?, ?, ?, ? )";
sqlite3_stmt *pstmt;
sqlite3_prepare_v2(ItemDB, sql.data(), -1, &pstmt, nullptr);
ifstream ifs("Item.txt", ios::binary);
string line;
getline(ifs, line); // コメント無視
getline(ifs, line); // 列名無視
sqlite3_exec(ItemDB, "BEGIN TRANSACTION transaction_name", 0, 0, &errMsg);
sqlite3_free(errMsg);
while (getline(ifs, line)) {
vector<string> v = split(line, regex(" "));
sqlite3_bind_int (pstmt, 1, stoi(v[0]));
sqlite3_bind_text(pstmt, 2, v[1].data(), v[1].size(), SQLITE_TRANSIENT);
sqlite3_bind_text(pstmt, 3, v[2].data(), v[2].size(), SQLITE_TRANSIENT);
sqlite3_bind_int (pstmt, 4, stoi(v[3]));
sqlite3_bind_text(pstmt, 5, v[4].data(), v[4].size(), SQLITE_TRANSIENT);
sqlite3_step(pstmt); // SQLの実行
sqlite3_reset(pstmt); //bindの関連付けをクリア(しないと同じsqlite3_stmtのSQLに再度bindできない)
sqlite3_clear_bindings(pstmt); //SQLITE_TRANSIENTで確保されたheap領域を解放
}
sqlite3_exec(ItemDB, "END TRANSACTION transaction_name", 0, 0, &errMsg);
sqlite3_free(errMsg);
sqlite3_finalize(pstmt);
sqlite3_close_v2(ItemDB);
return 0;
}
オフトピック
普通はこのようにSQLiteの関数を直接は呼び出しません。
自作かどなたかが作成されたwrapperクラスを使用します。
インターネットで SQLite wrapper などで検索すれば見つけることができるはずです。