Hỏi cách đọc file trong C++

Chào mọi người, mình có 1 file .txt như này:


#OBJECT_NUM 4

#ID 0
TYPE: BOX
POSITION: 100, 70, 100, 100

#ID 1
TYPE: CIRCLE
POSITION: 120, 300, 503

#ID 2
TYPE: BOX
POSITION: 400, 400, 150, 100

#ID 3
TYPE: BOX
POSITION: 400, 400, 100, 150

Bây giờ mình muốn đọc file này theo kiểu, nếu TYPE = BOX thì đọc POSITION của BOX, TYPE = CIRCLE thì đọc POSITION của CIRCLE và lấy ra 4 giá trị, ngoài ra không đọc những cái khác, còn check cả trường hợp có 2 hoặc nhiều CIRCLE hoặc nhiều BOX nữa, mong mọi người gợi ý giúp với

Hình như làm được bằng hàm fseek mà phức tạp lắm :scream: Nhưng mà để đơn giản hơn thì bạn chỉ cần lưu file lại như vậy thử xem. mỗi đối tượng có 2 dòng : dòng 1 thì mình có ID với TYPE, dòng 2 là POSITION của nó.

1 CIRCLE
120 300 503

0 BOX
100 70 100 100

2 BOX
400 400 150 100

3 BOX
400 400 100 150

Bây giờ bạn cứ phải đọc lại đến eof luôn cứ mỗi dòng read vào thì check xem là ID với TYPE nó đúng chưa đúng rồi đọc tiếp một dòng tiếp theo là được, rồi break ra.

1 Like

Nhưng mà đề yêu cầu đọc y nguyên như kia với lại phải có OBJECT_NUM 4 mới có điều kiện để kết thúc số lần đọc bạn ơi

Mình có ý tưởng là đọc dòng đầu tiên để lấy ra OBJECT_NUM rồi tiếp theo cho vòng lặp lặp từ 1 đến OBJECT_NUM để đọc các giá trị còn lại mà không biết triển khai như nào :frowning:

Tạo 1 vector của struct object, struct gồm id, type, và vector pos. Đọc đến type thì check rồi for tiếp để emplace_back vào vector pos

1 Like

Đi tàu rảnh quá không biết làm gì nên code luôn, bạn có thể tham khảo

[spoiler]https://wandbox.org/permlink/LR7CwWp05WpgYZlL[/spoiler]

1 Like

Cảm ơn bạn nhiều, nhưng mình thấy cách của bạn vẫn hơi hơi khó hiểu, liệu có thể chỉ dùng hàm fscanf mà đọc được hết không bạn

Bạn cần xác định lại là code C hay C++
File có cấu trúc thì cần phải đọc theo cấu trúc

1 Like

Rút gọn chương trình và chú thích rõ ràng, nếu là program lớn bạn có thể chia function/class

#include <iostream>
#include <cstdlib>
#include <fstream>
#include <vector>
#include <sstream>

struct Object
{
  int id;
  std::string type;
  std::vector< int > position;
};

int main()
{
  std::fstream fs("fin");
  std::string s_temp; // Temp for string that needless
  int obj_num; // Count of obj

  // Count num
  fs >> s_temp >> obj_num;

  std::vector< Object > objs;

  // Read
  for(int i = 0; i < obj_num; i++)
  {
    s_temp.clear(); // Clear temp for safe

    Object obj;

    fs >> s_temp >> obj.id;
    fs >> s_temp >> obj.type;
    
    fs >> s_temp; // Move cursor to end of "POSITION:"
    std::string lspos; // List Position
    std::getline(fs, lspos); // Get List Position
    std::stringstream ss(lspos); // Turn List Position to Stream
    std::string pos;
    char delimiter = ',';
    while(std::getline(ss, pos, delimiter))
    {
      obj.position.push_back(std::stoi(pos));
    }

    // Push obj to Obj List
    objs.emplace_back(obj);
  }

  fs.close();

  // Print
  for (const auto &obj : objs)
  {
    std::cout << "ID: " << obj.id << std::endl;
    std::cout << "TYPE: " << obj.type << std::endl;
    std::cout << "POSITION: ";
    for (const auto &p : obj.position)
    {
      std::cout << p << " ";

    }
    std::cout << std::endl;
  }

  //std::cout << obj_num << std::endl;
}
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?