Компилирана C++ програма, пълна с mojibake?

#include "StdAfx.h"
#include <stdlib.h>
#include <iostream>

#include "mysql_connection.h"

#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h>

using namespace std;

int main(void){
    cout << endl;

    try{
        sql::Driver *driver;
        sql::Connection *con;
        sql::Statement *stmt;
        sql::ResultSet *res;
        sql::PreparedStatement *pstmt;

        driver = get_driver_instance();
        con = driver->connect("REMOVED", "REMOVED", "REMOVED");
        con->setSchema("REMOVED");

        stmt = con->createStatement();
        res = stmt->executeQuery("SELECT username FROM player WHERE id=1");

        cout << "Username: " << res->getString("username") << endl;

        delete res;
        delete con;

        cout << "Done.";
        system("pause");

    }catch(sql::SQLException &e){
        cout << "# ERR: SQLException in " << __FILE__;
        cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << endl;
        cout << "# ERR: " << e.what();
        cout << " (MySQL error code: " << e.getErrorCode() << endl;
        cout << ", SQLState: " << e.getSQLState() << " )" << endl;
        system("pause");
    }

    return 0;
}

се превръща в... http://i.imgur.com/cIVnl.png

Какво се случва? :( Това е едва вторият ми ден, когато работя със C++, така че простете ми ужасно форматираното кодиране и други глупави грешки. Това винаги се показва точно преди да получа необработено изключение.


person user1253114    schedule 06.03.2012    source източник
comment
Резултатът, който получавате, изглежда като това, което се случва, когато изведете унитиализирана памет на система Windows в режим на отстраняване на грешки.   -  person Max Lybbert    schedule 07.03.2012
comment
Колкото и да си струва, макросите __FILE__, __FUNCTION__ и __LINE__ ще се разширят до името на файла, името на функцията и номера на реда на клаузата catch, а не името на файла, името на функцията и номера на реда, където е хвърлено самото изключение. Не съм сигурен дали това е информацията, която наистина искате. т.е. ще получите нещо като ERR: SQLException in foo.cpp (main) on line 42 ...   -  person Max Lybbert    schedule 07.03.2012
comment
@MaxLybbert Благодаря, нямах представа! Оценявам информацията, сигурен съм, че щях да бъда объркан от това в някакъв момент в бъдеще.   -  person user1253114    schedule 07.03.2012


Отговори (1)


API-тата, които използвате, връщат std::string обекти, според мен.

В този случай вероятно искате да добавите #include <sstream> в началото на вашия код, така че да имате добре дефиниран оператор „‹‹“ за класа std::string.

Не съм сигурен за това решение, защото бих очаквал да получите грешка при компилиране, която по някакъв начин подсказва, че не може да бъде намерен оператор „‹‹“.

Опитайте да залепите това в кода си и да го извикате от main() веднага, за да видите дали стрийминг операторите работят. Имайте предвид, че това ще накара вашата програма да излезе.

void SimpleStrings()
{
    std::string str("String in a std::string");
    const char *psz = "const-char-str";
    std::cout << "std::string: " << str << std::endl << "const char *: " << psz << std::endl;
    exit(1);
}
person Joe    schedule 06.03.2012
comment
Добавих #include <sstream> и сега той просто преминава през стотици редове с неразбираеми знаци, преди да се срине. Играя си с това вече няколко часа и се въртях напред-назад с различни неща - поставянето на потребителското име cout в while(res->next()){ цикъл (и затварянето му след потребителското име cout) ми изпраща спам с изхода на снимката по-горе, докато коментирам извън cout и напускането на цикъла while изпълнява нормално останалата част от кода. Това е просто този изход. Знам, че сега това се простира повече в проблем с MySQL, все пак... или може би моята обща новост. :( - person user1253114; 07.03.2012
comment
Вижте редакцията на публикацията ми, опитайте да добавите тестовата рутина и вижте дали работи добре. - person Joe; 07.03.2012
comment
Програмата „[8680] Test.exe: Native“ е излязла с код 1 (0x1). Случайно попаднах на тази връзка ( вижте актуализацията на приетия отговор) и се чудя дали това е проблемът... освен че се чувствам сякаш се скитам в страна, където не знам нищо, абсолютно нищо и не знам какво представляват те и как да подходя към промяната времето за изпълнение на конектора. Направих Google и разбрах как да променя времето за изпълнение на програмата - използването на /MT и /MD имаше същите резултати. Дали смяната на конекторите ще го оправи? - person user1253114; 07.03.2012
comment
Сигурен съм, че има значение как свързвате CRT. Когато сте се забъркали с /MT и /MD, може да искате да проверите дали сте го направили правилно. Visual C често изхвърля /MDd или /MTd, когато прави компилация за отстраняване на грешки. Проверете отново, като отворите връзката към регистрационния файл на компилацията в края на компилацията. Не толкова важно, но в идеалния случай ще изграждате със същата версия на Visual Studio, с която е изграден конекторът. Имате ли линк откъде сте взели конектора? Ако е така, мога да надникна. - person Joe; 07.03.2012
comment
Не съм съвсем сигурен за какво трябва да проверявам (съжалявам, мразя да съм ТОЗИ човек!). Току-що започнах да си играя с различните настройки и /MTd И /MDd изглежда прави всичко да функционира 100% правилно. Това е само с 2 минути тестване - без грешки, нищо като преди. Бих направил още тестове, но в момента съм притиснат от време. /MT хвърля същите грешки, както и /MD. Конектор @ връзка (mysql-connector-c++-1.1.0- win32.msi първо изтегляне на тази страница). Оценявам, че отделихте време да ми помогнете. Благодаря ти! - person user1253114; 07.03.2012
comment
Само за допълнително пояснение (свърши мястото по-горе) - с /MTd или /MDd включени, MySQL работи добре. Получава правилната стойност от базата данни, както трябва да бъде. - person user1253114; 07.03.2012