Почему ни одна из функций istream get не хранит ничего в этой c -строке? - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь выполнить sh очень простую задачу сохранения текста из файла в c -строку. По какой-то причине это просто не работает .

#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

struct student
{
    char id[8];
    char responses[20];
    int score;
    double grade;
};

int main()
{
    ifstream inFile("Ch8_Ex6Data.txt");

    char answerKey[20];
    inFile.getline(answerKey, 20);

    student students[256];

    inFile.getline(students[0].id, 8);

    cout << answerKey << endl;
    cout << students[0].id;

    return 0;
}

Вот копия Ch8_Ex6Data.txt

TTFTFTTTFTFTFFTTFTTF
ABC54102 T FTFTFTTTFTTFTTF TF
DEF56278 TTFTFTTTFTFTFFTTFTTF
ABC42366 TTFTFTTTFTFTFFTTF
ABC42586 TTTTFTTT TFTFFFTF

answerkey работает точно так, как это должно , но student[0].id остается пустым после функции get. Я пытался использовать оператор извлечения >>, getline() и get(), но ни один из них на самом деле не работает. Что я делаю не так?

Правка для ясности: я хочу, чтобы ABC54102 был сохранен в student[0].id.

1 Ответ

0 голосов
/ 15 апреля 2020

Это не относится к проблеме C строки.

Определение функции:

istream& getline (char* s, streamsize n );

istream& getline (char* s, streamsize n, char delim );

Извлекает символы из потока как неформатированный ввод, а сохраняет их в s в виде c -строки , пока либо извлеченный символ не станет символом-разделителем, либо пока не будет написано n символов. на s (включая завершающий нулевой символ).

Символом-разделителем является символ новой строки ('\n') для первой формы и delim для второй: при обнаружении во входной последовательности, он извлекается из входной последовательности, но отбрасывается и не записывается в s.

Функция также прекратит извлекать символы, если достигнут конец файла. Если это достигнуто преждевременно (перед тем, как написать n символов или найти delim), функция устанавливает флаг eofbit.

Флаг failbit устанавливается , если функция не извлекает никаких символов или , если символ-разделитель не найден один раз (n-1) символов, уже записанных в s. Обратите внимание, что если символ, который следует за этими (n-1) символами во входной последовательности, является именно символом-разделителем, он также извлекается, и флаг failbit не устанавливается (извлеченная последовательность была точно длиной n символов).

Нулевой символ ('\0') автоматически добавляется к записанной последовательности, если n больше нуля, даже если извлекается пустая строка.

Проблема заключается в том, что что массив char answerKey[20] недостаточно велик.

Используйте

char answerKey[21];
inFile.getline(answerKey, sizeof(answerKey))

и

//...
char id[9];
//...
inFile.getline(students[0].id, sizeof(id));

См. этот пример

При этом, однако, это не очень хороший метод, было бы предпочтительнее, если бы вы использовали std :: getline .

Вот это быстрый пример , который вы можете использовать и адаптировать к вашим потребностям.

Обратите внимание, что Я не использую пространство имен std .

...