01/10/2018, 11:58

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

Nguyễn Duy Hùng viết 14:14 ngày 01/10/2018

Hình như làm được bằng hàm fseek mà phức tạp lắm 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.

Công Thành Chiến viết 14:02 ngày 01/10/2018

OBJECT_NUM 4

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

Công Thành Chiến viết 14:08 ngày 01/10/2018

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

Dark.Hades viết 14:01 ngày 01/10/2018

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

Dark.Hades viết 14:10 ngày 01/10/2018

Đ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]

Công Thành Chiến viết 14:11 ngày 01/10/2018

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
POSITIO

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

Dark.Hades viết 14:15 ngày 01/10/2018

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

Dark.Hades viết 14:07 ngày 01/10/2018

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;
}
Bài liên quan
0