Проблема с чтением std :: vector из txt файла (читает только одно число) - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть проблема, которую не может решить та часть интернета, через которую я прошел. Это мое первое знакомство с fstream, и независимо от того, что я делаю, программа не будет импортировать более одного целого числа из текстового файла. Я хотел бы, чтобы кто-нибудь со знанием мог немного помочь мне. Вот код, который я использую в данный момент. Письмо:

void writeVector(const std::vector<int>& vec, const std::string& fileName) {
std::ofstream save;
save.open(fileName);
if (save) {
    for (int i = 0; i < vec.size(); ++i) {
        save << &vec[i];
    }

std::cout << "Plik zapisano pomyslnie.\n";
}
save.close();
}

Чтение:

std::vector<int> readVector(const std::string& fileName) {
std::ifstream read(fileName);
std::vector<int> buffer;
if (read) {
    int value;
    while (read >> value) {
        buffer.push_back(value);
    }
}
return buffer;
}

void zad4() {
    std::string fileName = "Zadanie 2";
    print(readVector(fileName));
}

Кроме того, меня беспокоит код в текстовом файле, поскольку он выглядит примерно так: (00000248EC48FE5000000248EC48FE5400000248EC48FE5800000248EC48FE5C и т. Д.). Когда я печатаю «буфер», он дает мне только один номер. Я убедился, что вектор правильно инициализирован. В чем может быть проблема?

Краткий ответ: (кредит: Сэм Варшавчик)

if (save) {
        for (int i = 0; i < vec.size(); ++i) {
            save << vec[i] << ' ';
        }

1 Ответ

0 голосов
/ 09 ноября 2018

Данные в файле выглядят как строка шестнадцатеричных значений. Ваша попытка прочитать эти данные пытается прочитать их с использованием десятичной дроби. Поскольку он начинается с десятичной цифры, а последовательность десятичных цифр не превышает максимального значения для int, попытка чтения удается получить одно значение. Это почти наверняка не , что вы на самом деле хотите сделать с этими данными.

Теперь, что на самом деле делать с этими данными, это отдельный вопрос. Вы можете захотеть прочитать подходящие группы шестнадцатеричных символов в соответствующие целые числа. Правильно ли это делать, зависит от того, что должны означать данные. Кажется, в цитируемом вами разделе есть повторяющийся шаблон (переписанный с разрывом строки после 16 символов / 8 байт):

00000248EC48FE50
00000248EC48FE54
00000248EC48FE58
00000248EC48FE5C

Кажется, это означает, что данные содержат некие 64-битные данные, записанные в hex. Форматированный ввод, используемый IOStreams, действительно любит получать пробелы. Одним из способов декодирования этих данных является чтение их в буфер с 16 символами, обновление строкового потока этими данными и чтение данных оттуда в виде шестнадцатеричных данных:

std::istringstream sin;
sin >> std::hex;
char               buffer[16];
while (read.read(buffer, 16)) {
    sin.str(std::string(buffer, buffer + read.gcount()));
    sin.clear();
    std::uint64_t value;
    if (!(sin >> value)) {
        break;
    }
    buffer.push_back(value);
}
...