トクナガ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ファイル操作

トクナガ

#1

投稿記事 by ファイル操作 » 11年前

http://marupeke296.com/SQLITE_No4_RPGIt ... ement.html
このサイト様を参考にSQLliteを勉強していたのですが

コード:

	// ファイルを読み込む
	char dummy[100], zName[24], zType[10], zComment[128], InsertSQL[512];
	int iID, iPrice;

	ifs.getline(dummy, 100);		//	コメント無視
	ifs.getline(dummy, 100);		//	列名無視

	while (1)
	{
		ifs >> iID >> zName >> zType >> iPrice >> zComment;
		if (ifs.eof())break;
		// データベースに登録
		sprintf(InsertSQL, Insert_Item_SQL, iID, zName, zType, iPrice, zComment);
		sqlite3_exec(ItemDB, InsertSQL, 0, 0, &errMsg);
	}

コード:

ifs >> iID >> zName >> zType >> iPrice >> zComment;
あとこれって何をしているんですか?

ファイル操作でつまってしまいましたorz
ファイル操作が苦手であまり勉強をしていない自分がわるいのですが
どなたか詳しく解説お願いいたします

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: トクナガ

#2

投稿記事 by みけCAT » 11年前

ファイル操作 さんが書きました:

コード:

ifs >> iID >> zName >> zType >> iPrice >> zComment;
あとこれって何をしているんですか?
オーバーロードされた演算子を利用し、ファイルの内容の読み込みをしています。
オフトピック
このプログラム、簡単にSQLインジェクション喰らいそうだな…
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: トクナガ

#3

投稿記事 by みけCAT » 11年前

ファイル操作 さんが書きました:ファイル操作でつまってしまいましたorz
具体的に何がどう上手くいかないのですか?
今回学びたいのがファイル操作ではなくSQLiteであり、可能であれば、無理にfstreamを使わずにfscanfやgetcなどの関数で読み込むのも一つの方法です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

sleep

Re: トクナガ

#4

投稿記事 by sleep » 11年前

ファイル操作 さんが書きました:

コード:

ifs >> iID >> zName >> zType >> iPrice >> zComment;
あとこれって何をしているんですか?
ファイルから読み込む文字列をホワイト スペース (タブ、半角スペース、改行 など)毎に区切って単語とし、split(分割)しています。
">>"毎に次のホワイトスペースまでの文字列を右辺の変数に代入します。
その際、代入先の変数の型をコンパイル時に認識済みなため、型変換が自動で行われ数字は数値型へも代入可能となっています。
ファイル操作 さんが書きました: http://marupeke296.com/SQLITE_No4_RPGIt ... ement.html
このサイト様を参考にSQLliteを勉強していたのですが
ファイル操作が分からなかったため、コード自体が何をしているか分からなかったのでしょうか?
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 などで検索すれば見つけることができるはずです。

閉鎖

“C言語何でも質問掲示板” へ戻る