Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 与fstream::read不一致的结果_C++_Io_Fstream - Fatal编程技术网

C++ 与fstream::read不一致的结果

C++ 与fstream::read不一致的结果,c++,io,fstream,C++,Io,Fstream,我的程序使用一个小的SQLite3数据库。为了确保它在程序启动时确实存在,我在一个文件中有一个数据库创建脚本,该脚本将被执行 脚本可以正常工作 但是,当使用C++ I/O函数从该文件读取时,我的文件末尾经常会出现无效字符,这会导致脚本包含错误,而SQLite库不能正确执行。以下是显示缓冲区内容时的示例: //如果文件中的内容正确,则存在一个随机字符 1. 执行请求时出错:接近“1”:语法错误 其他字符也会出现,空格,数字,字母。。。 下面是我加载脚本的代码: std::cerr <&l

我的程序使用一个小的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;
}

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

  • 为多个字符分配内存
  • 将空字符分配给
    缓冲区的最后一个元素


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

    delete [] buffer;
    

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

  • 为多个字符分配内存
  • 将空字符分配给
    缓冲区的最后一个元素


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

    delete [] buffer;
    

    <>不要混合C和C++,如果你想用C++读取C++中的SQL查询文件,那么C++下面的代码可以是一种不需要管理内存的方法,请注意分配一个额外的字符“0”等:

    #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;
    }
    
    #包括
    #包括
    #包括
    使用名称空间std;
    int main(){
    ifstream-fin(“test.sql”,std::fstream::binary | std::fstream::in);
    std::string sqlquery=std::string(std::istreambuf_迭代器(fin),std::istreambuf_迭代器());
    
    STD::CUT< P>不要混合C和C++,如果你想用IFScript读取C++中的SQL查询文件,那么C++下面的代码可以是一种不需要管理内存的方法,请注意分配一个额外的字符“0”等:

    #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;
    }
    
    #包括
    #包括
    #包括
    使用名称空间std;
    int main(){
    ifstream-fin(“test.sql”,std::fstream::binary | std::fstream::in);
    std::string sqlquery=std::string(std::istreambuf_迭代器(fin),std::istreambuf_迭代器());
    
    std::Coutthank你!这很奇怪,因为它在脚本较短时每次都没有空字节。你的回答修复了问题。@user96649,这是未定义行为的不幸之处。任何事情都可能发生,包括看似正常的行为。谢谢你!奇怪的是,它在脚本较短时每次都没有空字节他的脚本比较短。你回答了这个问题。@ USE9664,这是关于未定义行为的不幸。任何事情都可能发生,包括看似神态的行为。如果SqLITE3API允许我,我会使用STD::String。据我所知,它不适用于C++,所以我必须使用一个字符数组。CXString()/String方法来实现这一点。你完全正确,我没有考虑。我会纠正这个。谢谢。如果SqLITE3API允许我,我会使用STD::string。据我所知,它不适用于C++,所以我必须使用一个字符数组。你总是可以使用<代码>。
    string方法来实现这一点。你完全正确,我没有想到这一点。我会纠正这一点。谢谢。