искать и говорить о несовместимости

Я пишу консольное приложение C++. После создания матрицы с размером (int) rowSize и columnSize я хотел записать буквы в текстовом файле в матрицу, но цикл while никогда не запускается, потому что местоположение читателя равно -1, и я не мог довести его до 0. Есть идеи?

void writeText2Vec(ifstream & reader, tmatrix<char> & table){
    string s;
    int length, row = 0, column = 0; //beginning: column and
                                     //row ids are set to 0.
    reader.seekg(0); //reset the pointer to start

    cout << reader.tellg(); // it results in -1.
    while (getline(reader,s)){
        //for each line while loop occurs.
        length = s.length();
        for(column = 0; column < length; column++)
        {
            table[row][column] = s.at(column);
            //writing the letter to matrix.
        }
        row++;
    }

bool openFile(ifstream & reader, string filename){
    reader.open(filename.c_str());

    if (reader.fail()){
        exit("File cannot be found.");
        return false;
    }
    else {
        return true;
    }
}

bool check(ifstream & reader, int & rowSize, int & columnSize){
    //checks for valid characters, if they are
    //alphabetical or not and for the length.

    string s;
    int len = 0, max = 0;
    while (getline(reader,s)){
        //runs for every line.
        rowSize++; //calculation of row size

        while (len < s.length()){
            if (!(isalpha(s.at(len)))){
                // Check to see if all characters are alphabetic.
                exit("Matrix contains invalid characters!");
                return false;
            }
            len++;
        }
        if (max == 0){
            //if max is not set.
            max = len;
            len = 0;
        }
        else if (!(max == len)){
            //if they are different, then appropriate
            //error message is returned.
            exit("Matrix is not in a correct format!");
            return false;
        }
        else {
            //else it resets.
            len = 0;
        }
    }
    rowSize -= 1;
    columnSize = s.length(); //the last length is equal to column size
    return true;
}

person Yagiz    schedule 06.03.2012    source источник
comment
-1 возвращаемое значение из tellg() указывает на ошибку, а не на позицию. Можете ли вы опубликовать код вызова writeText2Vec()?   -  person hmjd    schedule 06.03.2012
comment
Вместо этого попробуйте reader.seekg(0, std::ios::beg).   -  person Kerrek SB    schedule 06.03.2012
comment
попробовал ios::beg, но результат не изменился. таблица tmatrix‹char›(rowSize, columnSize); //создание матричной таблицы. writeText2Vec(читатель, таблица); // записываем текстовый файл в матрицу.   -  person Yagiz    schedule 06.03.2012
comment
@ Алекс, можешь ли ты задать вопрос, который открывает reader и вызывает writeText2Vec()? Это может быть проблема с открытием файла reader.   -  person hmjd    schedule 06.03.2012
comment
@hmjd добавил к вопросу функции. код, который вызывает эти функции: if ((openFile(reader, filename) == true) && (check(reader, rowSize, columnSize) == true)){ //если проверки верны, программа продолжает char› таблица(rowSize, columnSize); //создание матричной таблицы. writeText2Vec(читатель, таблица); // записываем текстовый файл в матрицу.   -  person Yagiz    schedule 06.03.2012


Ответы (1)


tellg() возвращает -1 при возникновении ошибки. Поток, вероятно, находился в состоянии ошибки, когда вы вызывали функцию. Если вы дочитали до конца один раз, значит, был ввод, который не удался, и поток находится в состоянии ошибки, которое необходимо очистить, прежде чем будут работать любые другие операции: reader.clear().

person James Kanze    schedule 06.03.2012