Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

C++ Бинарный файл

Роман Protocol Мыслитель (8562), закрыт 4 года назад
Всем привет!
Откуда взялись пустые поля и как их убрать? В смысле ещё одна строка.
#include <iostream>
#include <string>
#include <fstream>
#include <windows.h>
class student
{
private:
std::string name;
std::string group_number;
public:
void set()
{
std::cout << "Введите ФИО\n";
std::getline(std::cin, name);
std::cout << "Введите номер группы\n";
std::getline(std::cin, group_number);
}
void show()
{
std::cout << "ФИО\n" << name << "\n";
std::cout << "Номер группы\n" << group_number << "\n";
}
};
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
const std::string path("binary.txt");
/*
std::cout << "Укажите количество студентов ";
size_t count;
std::cin >> count;
std::cin.get();
std::ofstream fout;
fout.open(path, std::ios::binary);
for (size_t u = 0u; u < count; ++u)
{
student s;
s.set();
fout.write(reinterpret_cast<char*>(&s), sizeof(student));
}
fout.close();
*/
//Чтение: проверим, что содержимое файла совпадает с массивом
std::ifstream in;
in.open(path, std::ios::binary);
for (;in.good();)
{
student temp;
in.read(reinterpret_cast<char*>(&temp), sizeof(student));
temp.show();
}
return 0;
}
Спасибо за ответы!
Дополнен 4 года назад
Лучший ответ
H-p A Просветленный (46828) 4 года назад
при чтении файла неправильно ищешь eof по-моему. вот и получается одна лишняя запись.
флаг ставится после первого неудачного in.read, поэтому после него и надо проверять и делать выход из цикла.
Роман ProtocolМыслитель (8562) 4 года назад
Так?
std::ifstream in;
in.open(path, std::ios::binary);
for (;;)
{
student temp;
in.read(reinterpret_cast(&temp), sizeof(student));
if (!in.good())
{
break;
}
temp.show();
}
Это только при бинарном режиме? В обычном текстовом режиме я писал for(;fin.good();){...} и всё нормально читалось.
Остальные ответы
Я Красавчег Мыслитель (7513) 4 года назад
for (;in.good();) // выполняем пока не нарвемся на ошибку.
{
student temp;
in.read(reinterpret_cast<char*>(&temp), sizeof(student));
temp.show();
}

То есть сначала будет ошибка чтения в цикле, которая и выведет пустую строку, а потом выйдет из цикла.
Попробуйте так:
while(!in.eof())
Роман ProtocolМыслитель (8562) 4 года назад
Также одна запись лишняя выводится и при while(!in.eof()).
Роман ProtocolМыслитель (8562) 4 года назад
Так работает. Странно.
std::ifstream in;
in.open(path, std::ios::binary);
for (;;)
{
student temp;
in.read(reinterpret_cast(&temp), sizeof(student));
if (!in.good())
{
break;
}
temp.show();
}
Как раз всё правильно. Порядок действий чтение, проверка корректности, вывод - единственно верный. Вы его нарушили, и получили лишнюю запись. Можно было проверку корректности вставить в show(), но это не лучшая идея.
Похожие вопросы