Lỗi đọc/ghi danh sách từ file C++

Em dang làm bài tập đọc/ghi file một danh sách mảng thiên thạch gồm MÃ , TÂM THIÊN THẠCH, BÁN KÍNH, TỐC ĐỘ BAY sau đó xuất ra file output.txt nhưng bị lỗi, em debug thử thì thấy ngay vòng lặp nhập mảng thiên thạch tới i=2 thì nó bắt đầu lỗi, nó nhận được MÃ C03 nhưng không nhận được TÂM ,BÁN KÍNH, TỐC ĐỘ BAY trong khi i=0,i=1 chạy bình thường, em cũng không biết sửa sao nữa ạ, mong mọi người giúp em với

Em tạo 3 class : CMangThienThach, CThienThach, CPoint2D

trong file Input.txt :
C07 (3.1, 4.5) 4.56 12
C04 (2.1, 7.0) 2.6 21
C03 (3.7, 99.0) 3.2 14

#pragma once
#include<iostream>
#include <math.h>
using namespace std;
class CPoint2D
{
private:
	float dX;
	float dY;
public:
	CPoint2D Init(float, float);
	void Nhap();
	float getdX();
	float getdY();
	void setdX(float);
	void setdY(float);
	float tinhKhoangCach(CPoint2D);
	CPoint2D(float, float);
	CPoint2D();
	~CPoint2D();
}; 
//class.cpp
#include "Point2D.h"
void CPoint2D::Nhap() {
	char c1,c2,p,t;
	cin >> c1 >> dX >> p >> dY >> c2;
}
CPoint2D CPoint2D::Init(float x, float y) {
	this->dX = x;
	this->dY = y;
	return *this;
}
float CPoint2D::getdX() {
	return dX;
}
float CPoint2D::getdY() {
	return dY;
}
void CPoint2D::setdX(float a) {
	dX = a;
}
void CPoint2D::setdY(float b) {
	dY = b;
}
float CPoint2D::tinhKhoangCach(CPoint2D c) {

	return sqrt((this->dX - c.dX)*(this->dX - c.dX) + (this->dY - c.dY)*(this->dY - c.dY));
}
CPoint2D::CPoint2D(float x, float y)
{
	dX = x;
	dY = y;
}
CPoint2D::CPoint2D()
{
}


CPoint2D::~CPoint2D()
{
}

#pragma once
#include <iostream>
#include "Point2D.h"
#include <string>
using namespace std;
class CThienThach
{
private :
	string ma;
	CPoint2D tamThienThach;
	float radius;
	float tocDoBay;

public:
	void Nhap();
	void Xuat();
	CThienThach();
	~CThienThach();
};

//class.cpp
#include "ThienThach.h"
void CThienThach::Nhap() {
	string temp,r;
	getline(cin, temp);
	ma = temp.substr(0, 3);
	int t = temp.size() - 2;
	cin.seekg(-t,ios::cur);
	tamThienThach.Nhap();
	cin >> radius >> tocDoBay;
	getline(cin, r);

}
void CThienThach::Xuat() {
	cout << ma << " (" << tamThienThach.getdX() <<", "<< tamThienThach.getdY() << ") " << radius << " " << tocDoBay << endl;
}

CThienThach::CThienThach()
{
}


CThienThach::~CThienThach()
{
}

#pragma once
#include "ThienThach.h"
class CMangThienThach
{
private :
	CThienThach ds[100];
	int n;
public:
	void Nhap();
	void Xuat();
	CMangThienThach();
	~CMangThienThach();
};

//class.cpp

#include "MangThienThach.h"
void CMangThienThach::Nhap() {
	int i = 0;
	while (!cin.eof()) {
		ds[i].Nhap();
		i++;
	}
	n = i;
}
void CMangThienThach::Xuat() {
	for (int i = 0; i < n; i++) {
		ds[i].Xuat();
	}
}


CMangThienThach::CMangThienThach()
{
}


CMangThienThach::~CMangThienThach()
{
}
// Hàm main

#define _CRT_SECURE_NO_WARNINGS
#include "Point2D.h"
#include "ThienThach.h"
#include <conio.h>
#include "MangThienThach.h"
void main() {
	CMangThienThach a;
	freopen("INPUT.txt", "rt", stdin);
	a.Nhap();
	freopen("Output.txt", "wt", stdout);
	a.Xuat();
	_getch();

}

Gì mà getline() rồi seekg() rồi getline(). Bạn có chắc quá trình seekg()getline(), con trỏ đang trỏ đúng chỗ bạn cần không?

Sao không dùng getline() một lần, rồi sau đó dùng các hàm như string::find(), string::substr() để cắt có trình tự các giá trị cần lấy. Chuyển chúng từ chuỗi sang kiểu giá trị tương đương.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?