不推荐使用的getch() - 切换到编译器_getch()建议仍会导致问题

时间:2016-02-08 19:00:42

标签: c++ fstream getch

我真的需要你的帮助,我希望我能得到一些关于编译错误的线索。

我的代码有问题:

char user_ch;
do {
        user_ch=_getch(); // i changed it from getch() to fix the previous error, didn't help it seems
        switch (user_ch) {
            case '1': response='1'; break;
            case '3': response='3';
        }
} while (response!='1'||response!='3');

编译器错误(特别是'构建'错误而不是' debug'错误):

error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'

编译器引用fstream文件中的这段代码:

private:
_Myfb _Filebuffer;  // the file buffer
};

有人指出我发布了我对fstream函数和对象的使用。 我的函数解析settings.txt文件

bool read_bool(ifstream file, int verse) {
string temp_var;
for (int i=0; i<verse; i++)
    getline(file, temp_var);
if (temp_var=="true") return true;
else return false; }

int read_int(ifstream file, int verse) {
string temp_var;
for (int i=0; i<verse; i++)
    getline(file, temp_var);
return stoi(temp_var); }

t_direction read_t_dir(ifstream file, int verse) {
char temp_var;
for (int i=0; i<verse; i++)
file.get(temp_var);
t_direction pre_return;
switch (temp_var) {
    case '1': pre_return=to_mother; break;
    case '2': pre_return=to_foreign; break;
    case '3': pre_return=rndom;
}
return pre_return; }

string read_string(ifstream file, int verse) {
string temp_var;
for (int i=0; i<verse; i++)
    getline(file, temp_var);
return temp_var; }

size_t lines_count(ifstream if_file) {
size_t a=0;
string temp_str;
while (getline(if_file, temp_str)) 
    ++a;
return a; }

bool add_mistake(ofstream file, string mistake, string to_trans, string target) {
file << "Original: " << to_trans << "\nShould be: " << target;
file << "\nYour response: " << mistake;
file << "\n---------------------\n";
return true; }

出于错误安全的考虑,我从未打开或关闭函数内的fstream对象

// stream from file and tokenize
// SYNTAX FOR FILE (each line): word,word>word,word,word
words_input.open(FILE_NAME);
string buffer_line, token;
for (size_t i; i<number_of_lines; i++) {
    getline(words_input, buffer_line);
    istringstream language_split(buffer_line);
    vector<string> container(2);
    while (getline(language_split, token, '>')) // split languages
        container.push_back(token); // hard coded to ignore possible elements 3, 4, 5...
    istringstream synonym_source_split(container.at(0));
    while (getline(synonym_source_split, token, ',')) // first language synonyms
        source_words[i].push_back(token);
    istringstream synonym_target_split(container.at(1));
    while (getline(synonym_target_split, token, ',')) // second language synonyms
        target_words[i].push_back(token);
}
words_input.close();

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您的问题出在代码的这一部分:

string read_string(ifstream file, int verse) {
    string temp_var;
    for (int i=0; i<verse; i++)
        getline(file, temp_var);
    return temp_var;
}

size_t lines_count(ifstream if_file) {
    size_t a=0;
    string temp_str;
    while (getline(if_file, temp_str)) 
        ++a;
    return a;
}

这两个函数都将ifstream类型的参数作为输入。由于您未通过引用接收ifstream,因此当您调用此函数时,C ++会尝试将if_file初始化为您传入的ifstream副本参数。这是不允许的,因为ifstream无法被复制。不幸的是,您倾向于收到垃圾错误消息,例如您在上面显示的消息,而不是在这种情况下更有用的消息。

要解决此问题,请更改代码,以便通过引用获取参数:

string read_string(ifstream& file, int verse) {
    string temp_var;
    for (int i=0; i<verse; i++)
        getline(file, temp_var);
    return temp_var;
}

size_t lines_count(ifstream& if_file) {
    size_t a=0;
    string temp_str;
    while (getline(if_file, temp_str)) 
        ++a;
    return a;
}

也就是说,代码中可能存在其他错误。我强烈建议您逐步评论代码并逐步测试代码,因为编写代码非常难以理解。