Несовместимые результаты с fstream :: read - PullRequest
0 голосов
/ 17 мая 2018

Моя программа использует небольшую базу данных 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 голосов
/ 17 мая 2018

Не смешивайте C и C ++. Если вы хотите прочитать файл SQL-запроса в C ++ с использованием ifstream, то приведенный ниже код на 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;
}
0 голосов
/ 17 мая 2018

Вы должны убедиться, что у вас есть строка с нулевым символом в конце.

  1. Выделите память для еще одного символа.
  2. Назначить нулевой символ последнему элементу buffer.

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

Также используйте массив в виде delete.

delete [] buffer;
...