c++ - fstream::read 的结果不一致

标签 c++ io fstream

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

脚本运行没有问题。

但是,当使用 C++ I/O 函数读取该文件时,我经常会在文件末尾收到无效字符,这会导致脚本包含错误并且无法被 SQLite 库正确执行。这是显示缓冲区内容的示例: //文件中的正确内容,然后是一个随机字符 1个 执行请求时出错:“1”附近:语法错误

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

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;
}

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

最佳答案

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

  1. 再分配一个字符的内存。
  2. 将空字符分配给 buffer 的最后一个元素。

buffer = new char[script_length+1];
script_fs.read(buffer, script_length);
buffer[script_length] = '\0';

同样,使用delete的数组形式。

delete [] buffer;

关于c++ - fstream::read 的结果不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50384093/

相关文章:

c++ - ifstream 读取二进制数据发出 0x00 字节

c++ - 在 C++ 中读取带有冒号分隔符的文件

c++ - 在 Eigen 中提高 SelfAdjointEigenSolver 的精度

c++ - 如何减少基于 MingW 的 GUI 应用程序的内存消耗?

c++ - 命名空间中的类定义出去吃午饭,永不返回

scala - Scala 分配评估 Unit 而不是分配的值的动机是什么?

java - 在 Web 应用程序中使用 Java 和 JSON 文件设计建议

c++ - 如何存储以二进制模式 C++ 读取的文件中的数据

c++ - ld 找不到 opencv highgui 符号(未定义的引用)

io - Lua 4.0.1 附录