Vector.push_back () добавляет тот же элемент при чтении из файла - PullRequest
0 голосов
/ 18 февраля 2019

Мой код читает набор элементов из файла и добавляет их в вектор.Цикл for читает все элементы и через push_back они добавляются в вектор.Прекрасно работает на бумаге, НО: в итоге все элементы в векторе равны и всегда последний прочитанный элемент.

Я на 100% уверен, что элементы, перечисленные в файле, не совпадают (из-застарый добрый NotePad ++).Я попытался отключить чтение элементов, чтобы проверить, есть ли проблема с функцией f_read.Программа выводила Элементы отлично и в правильном порядке.Я предполагаю, что ошибка не с файлом или функцией f_read.

FILE* f = fopen(filepath, "rb");
unsigned char header[19];
fread_s(header, sizeof(header), sizeof(unsigned char), 19, f);

vector<char*> myVector;
int size = 28 * 28;
char temp[28 * 28];

for (int i = 0; i < 2; i++) {
    fread_s(temp, 28*28, sizeof(unsigned char), size, f);
    myVector.push_back(temp);
}

(19 бит, которые я читаю в массиве "info", являются заголовком)

IОжидайте, что вектор будет содержать все считанные элементы в правильном порядке.

1 Ответ

0 голосов
/ 18 февраля 2019

Как уже упоминалось в комментариях, вы перемещаете указатели назад, а не фактические строки.Чтобы получить действительные строки, вы можете сделать это:

void readFileToVec()
{
    ifstream file;
    file.open ("rb");
    vector<string> v;
    string word;
    while (file >> word)
    {
        v.push_back(word);
    }
}

Это будет работать, если все элементы являются строками и разделены пробелом, табуляцией или символом новой строки.Если ваши слова разделены чем-либо, кроме одного из этих трех (например, список слов, разделенных запятыми), то вы можете использовать getline и указать разделитель.

В любом случае, чтение о потоках C ++ и разнице между строками в стиле C и строками STL было бы целесообразно, если вы собираетесь снова делать подобные вещи с C ++.Вы используете C Strings и старый школьный FILE, который является частью библиотеки C, в то время как C ++ предоставляет вам утилиты, которые сделают вашу жизнь проще.Файловые потоки и строки C ++ являются отличными примерами таких утилит.

...