bỏ xài seekg(1) luôn, xài FileIn.ignore()
là nó cũng tự động bỏ qua 1 ký tự. Tới cuối dòng thì ko cần biết là \r\n
hay \n
, xài FileIn.ignore(100, '\n');
là nó tự động bỏ qua 100 ký tự hoặc tới khi gặp \n
thì dừng.
bỏ luôn mấy cái biến phụ đi, sao ko xài thẳng cái struct luôn
for (stdinf f; ; s.push_back(f))
{
if (!std::getline(FileIn, f.name, '-')) break;
FileIn.ignore();
if (!std::getline(FileIn, f.phone_number, '-')) break;
FileIn.ignore();
if (!std::getline(FileIn, f.address, '-')) break;
FileIn.ignore();
if (!(FileIn >> f.Math >> f.Physics >> f.Chemistry)) break;
FileIn.ignore(100, '\n');
f.AveragePoint = (f.Math + f.Physics + f.Chemistry) / 3;
f.name.erase(f.name.end() - 1);
f.phone_number.erase(f.phone_number.end() - 1);
f.address.erase(f.address.end() - 1);
}
đặt break tùm lum hết cho chắc, ko thì đặt ở điều kiện đầu f.name
cũng đủ rồi
để cho chắc ăn dữ liệu struct nào nằm trên dòng struct đó thì đọc 1 lần 1 dòng, rồi parse dòng đó vào struct, xài stringstream:
for (std::string line; std::getline(FileIn, line); s.push_back(parseStdinf(line)));
viết 1 hàm stdinf parseStdinf(const std::string& record)
nữa là xong:
stdinf parseStdinf(const std::string& record)
{
std::istringstream in(record); //#include <sstream>
stdinf f;
if (!std::getline(in, f.name, '-'))
throw std::runtime_error("Invalid record: name"); //#include <stdexcept>
in.ignore();
if (!std::getline(in, f.phone_number, '-'))
throw std::runtime_error("Invalid record: phone_number");
in.ignore();
if (!std::getline(in, f.address, '-'))
throw std::runtime_error("Invalid record: address");
in.ignore();
if (!(in >> f.Math >> f.Physics >> f.Chemistry))
throw std::runtime_error("Invalid record: Math/Physics/Chemistry");
f.AveragePoint = (f.Math + f.Physics + f.Chemistry) / 3;
f.name.erase(f.name.end() - 1);
f.phone_number.erase(f.phone_number.end() - 1);
f.address.erase(f.address.end() - 1);
return f;
}