我是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();
}
答案 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;
}