fstream :: read的结果不一致

时间:2018-05-17 05:43:57

标签: c++ io fstream

我的程序使用一个小的SQLite3数据库。为了确保程序启动时它确实存在,我在一个文件中有一个数据库创建脚本,该脚本被执行。

脚本没有问题。

但是,当使用C ++ I / O函数从该文件中读取时,我的文件末尾经常会出现无效字符,这会导致脚本包含错误并且SQLite库无法正确执行。以下是显示缓冲区内容时的示例: // Proper content from the file, then a random character is there 1 Error executing request: near "1": syntax error

还会出现其他字符,空格,数字,字母...... 这是我加载脚本的代码:

std::cerr << "Creating database if needed...\n";
char sql_script[] = "/path/to/script.sql";
int script_length;
bool result = false;
std::ifstream script_fs(sql_script, std::fstream::binary | std::fstream::in);

if (script_fs) {
    char* buffer;
    char** err_msg = NULL;
    script_fs.seekg(0, script_fs.end);
    script_length = script_fs.tellg();
    script_fs.seekg(0, script_fs.beg);

    buffer = new char[script_length];
    script_fs.read(buffer, script_length);

    std::cout << "sql:\n" << buffer << "\n";

    if (sqlite3_exec(m_db, buffer, NULL, NULL, err_msg) == SQLITE_OK){
        result = true;
    } else {
        std::cerr << "Error executing: " << sqlite3_errmsg(m_db) << "\n" << err_msg << "\n";
    }
    delete buffer;
    script_fs.close();
} else {
    std::cerr << "Error opening script: " << strerror(errno) << "\n";
}

return result;
}

为什么会发生这种情况?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您需要确保您有一个以空字符结尾的字符串。

  1. 为另外一个角色分配内存。
  2. 将空字符分配给buffer的最后一个元素。
  3. buffer = new char[script_length+1];
    script_fs.read(buffer, script_length);
    buffer[script_length] = '\0';
    

    另外,使用delete的数组形式。

    delete [] buffer;
    

答案 1 :(得分:1)

不要混用C和C ++,如果你想使用ifstream在C ++中读取sql查询文件,那么在C ++下面的代码可能是你不需要管理内存的一种方法,照顾比如分配一个额外的char&#39; \ 0&#39;等:

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main() {
  ifstream fin("test.sql", std::fstream::binary | std::fstream::in);
  std::string sqlquery = std::string(std::istreambuf_iterator<char>(fin), std::istreambuf_iterator<char>());
  std::cout<<sqlquery<<std::endl;
  return 0;
}