在C ++中存储和操作SQLite查询的结果

时间:2015-01-04 01:43:34

标签: c++ sqlite

我是C ++和SQLlite的初学者,并尝试编译可以操纵SQLite查询结果的代码。

我很难将结果存储到.txt文件中,这样我就可以操作结果,而且不知道从哪里开始,

因此,我只能在MA.txt中看到一行,但我想存储所有结果,

我想将结果存储到.txt文件中,因为在存储结果后,我必须将结果划分为预定义的长度并找到最大值和最小值,并报告第一行和最后一行。

#include <iostream>
#include <iomanip>
#include <ctime>
#include <stdlib.h>
#include <sqlite3.h> 
#include <string> 
#include <locale> 
#include <sstream> 
#include <time.h>
#include <stdio.h>
#include <fstream> 
#include <vector>

using namespace std;

static int callback2(void *data, int argc, char **argv, char **azColName)
{
    ofstream os;
    os.open("MA.txt");
    os << argv[0] << endl;
    return 0;
    os.close();
}

int main(int argc, char* argv [])
{
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;
    const char* data = "Callback function called";
    rc = sqlite3_open("test.db", &db);
    if (rc){
        cout << "Can't open database: %s\n" << sqlite3_errmsg(db);
        exit(0);
    }
    string sql = "SELECT * from forex;";
    rc = sqlite3_exec(db, sql.c_str(), callback2, (void*) data, &zErrMsg);
    if (rc != SQLITE_OK){
        cout << "SQL error:" << zErrMsg;
        sqlite3_free(zErrMsg);
    }

    return 0;
}

我更改了代码,但是我得到了&#34; os没有命名类型&#34;编译时出错,

我应该在哪里放弃,对不起我真的是一个noobie :(

#include <iostream>
#include <iomanip>
#include <ctime>
#include <stdlib.h>
#include <sqlite3.h> 
#include <string> 
#include <locale> 
#include <sstream> 
#include <time.h>
#include <stdio.h>
#include <fstream> 
#include <vector>

using namespace std;
ofstream os;
os.open("MA.txt");
static int callback2(void *data, int argc, char **argv, char **azColName)
{
    os << argv[0] << endl;
    return 0;
}

int main(int argc, char* argv [])
{
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;
    const char* data = "Callback function called";
    rc = sqlite3_open("test.db", &db);
    if (rc){
        cout << "Can't open database: %s\n" << sqlite3_errmsg(db);
        exit(0);
    }
    string sql = "SELECT * from forex;";
    rc = sqlite3_exec(db, sql.c_str(), callback2, (void*) data, &zErrMsg);
    if (rc != SQLITE_OK){
        cout << "SQL error:" << zErrMsg;
        sqlite3_free(zErrMsg);
    }

    return 0;
    os.close();
}

1 个答案:

答案 0 :(得分:2)

我认为这是因为您打开文件的方式。每次读取新记录时都会打开它,这会导致它每次都返回到开头。

解决此问题的一种方法是在函数外部声明ofstream并在函数外部打开它,并在最后关闭它。修复它的另一种方法是使用std :: app标志设置打开ofstream,以便它将附加到文件而不是重写它。

另一件事是你正在回归&#39; 0&#39; 0来自回叫功能。您需要返回SQLITE_OK以告知它继续。

不确定这是否有效,因为我还没有测试过,但请尝试以下代码:

#include <iostream>
#include <iomanip>
#include <ctime>
#include <stdlib.h>
#include <sqlite3.h> 
#include <string> 
#include <locale> 
#include <sstream> 
#include <time.h>
#include <stdio.h>
#include <fstream> 
#include <vector>

using namespace std;
static int callback2(void *data, int argc, char **argv, char **azColName) {
    ofstream os("MA.txt", ios::app);
    os << argv[0] << endl;
    os.close();
    return SQLITE_OK;
}

int main(int argc, char* argv []) {
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;
    const char* data = "Callback function called";
    rc = sqlite3_open("test.db", &db);
    if (rc){
        cout << "Can't open database: %s\n" << sqlite3_errmsg(db);
        exit(0);
    }
    char sql[21] = "SELECT * from forex;";
    rc = sqlite3_exec(db, sql.c_str(), callback2, NULL, &zErrMsg);
    if (rc != SQLITE_OK){
        cout << "SQL error:" << zErrMsg;
        sqlite3_free(zErrMsg);
    }

    return 0;
}