Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Từ 1 tới 8 trên tổng số 8 kết quả

Đề tài: Hỏi về cách Đọc/ghi vào File một (mảng) dữ liệu có cấu trúc trong C++

  1. #1
    Ngày gia nhập
    10 2007
    Bài viết
    24

    Question Hỏi về cách Đọc/ghi vào File một (mảng) dữ liệu có cấu trúc trong C++

    Các member cho hỏi làm sao chúng ta có thể đọc/ghi một mảng cấu trúc vào File trong C++ được.Tôi đã biết làm như thế trong C như sau (dùng File Nhị phân):
    ==>Lưu một mảng các phân số vào File và đọc File để xử lý khi cần thiết:
    C++ Code:
    1. struct phanso
    2. {
    3.      int tu;
    4.      int mau;
    5. };
    C++ Code:
    1. void luuthongtin( phanso info[],int n) //info la mang cac phan so
    2. {
    3.     FILE *output;
    4.     output=fopen("phanso.dat","wb");
    5.     fwrite(info,sizeof(phanso ),n,output);
    6.     fclose(output);
    7. }
    8. void docthongtin(FILE *f,phanso  info[],int n)
    9. {
    10.     f=fopen("phanso.dat","rb");
    11.     fseek(f,0,SEEK_SET); //chuyen con tro ve dau File
    12.     fread(info,sizeof(phanso ),n,f);
    13.     fclose(f);
    14. }
    Ở đây là sau khi ghi thông tin rồi và đọc lại FIlE đó thì trật tự rất đúng.Nghĩa là mỗi phân số thứ i trong mảng đều chính xác.
    Đó như vậy đó!!Nhưng bên C++ tôi làm tương tự nhưng ko dc.Nếu dc xin coding một ví dụ cho trực quan nhé.Thanks nhiều.
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

  2. #2
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Trong C++ cũng dùng file nhị phân, nhưng cú pháp khác 1 tí do trong C++ nó đã có class fstream cho việc ghi và đọc file. Về file C++ thì còn nhiều cái để nói lắm, h thì chỉ demo cho cậu 1 ví dụ đơn giản được thui, khi nào tui học bài xong thì tui cho thêm example T_T.
    C++ Code:
    1. #include <iostream>
    2. #include <string>
    3. #include <fstream>
    4.  
    5. struct MyData{
    6.   std::string _mName;
    7.   int _mAge;
    8. };
    9.  
    10. int main()
    11. {
    12.   MyData oss;
    13.   std::fstream clientFile("data.txt", std::ios::out | std::ios::binary);
    14.   std::cout << "Name : ";
    15.   std::getline(std::cin, oss._mName);
    16.   std::cout << "\nAge : ";
    17.   std::cin >> oss._mAge;
    18.  
    19.   clientFile.write(reinterpret_cast<char *>(&oss), sizeof(oss));
    20.  
    21.   clientFile.close();
    22. }

  3. #3
    Ngày gia nhập
    10 2007
    Bài viết
    24

    Cám ơn bạn đã giúp đỡ nhưng mà tôi có ý kiến sau:
    cái ví dụ bạn nêu ra chỉ là đọc/ghi 1 biến struct thôi.Còn ở đây tôi muốn mở rộng ra là ta đọc/ghi một mảng các struct đó.bạn viết ví dụ về:ghi vào FILE và load thông tin từ File ra nhé.Thiệt tình tôi đã test thử và vọc rồi nhưng mà hàm fstream.write & fstream.read chỉ có 2 tham số hà.vậy ta làm thế nào nhỉ?
    Thank nhiều.

  4. #4
    Ngày gia nhập
    11 2006
    Bài viết
    75

    Serialization ? Em đoán đúng ko bác ?
    Our dreams are young and we both know they take us where we want to go...

  5. #5
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Làm sao cho bạn pass thêm tham số vào được, struct là mix data type vì thế nó mới cần dùng ở Binary mode. Còn nếu muốn dùng chung nhiều struct, đây là 1 ví dụ :
    C++ Code:
    1. #include <iostream>
    2. #include <string>
    3. #include <fstream>
    4. #include <vector>
    5.  
    6. struct MyData{
    7.   std::string _mName;
    8.   int _mAge;
    9. };
    10.  
    11. int main()
    12. {
    13.   MyData first = {"Elitor", 21};
    14.   MyData second = {"Omarion", 22};
    15.   MyData third = {"Vigue", 19};
    16.  
    17.   std::vector<MyData> personInfo;
    18.  
    19.   std::fstream clientFile("data.txt", std::ios::out | std::ios::binary);
    20.   clientFile.write(reinterpret_cast<char *>(&personInfo), sizeof(personInfo));
    21.  
    22.   clientFile.close();
    23. }
    Còn ghi vào file thì thay vì dùng write thì dùng read, muốn access file cỡ trâu bò thì dùng 2 thằng seekq và seekp.
    Demo :
    C++ Code:
    1. #include <iostream>
    2. #include <fstream>
    3. using namespace std;
    4.  
    5. const int DESC_SIZE = 31;
    6. struct InventoryItem{
    7.   char desc[DESC_SIZE];
    8.   int qty;
    9.   double price;
    10. };
    11.  
    12. int main()
    13. {
    14.   InventoryItem record;  
    15.   long recNum;          
    16.   fstream inventory("Inventory.dat",
    17.                      ios::in | ios::out | ios::binary);
    18.  
    19.   cout << "Which record do you want to edit? ";
    20.   cin >> recNum;
    21.  
    22.    
    23.   inventory.seekg(recNum * sizeof(record), ios::beg);
    24.   inventory.read(reinterpret_cast<char *>(&record),
    25.                  sizeof(record));
    26.  
    27.  
    28.   cout << "Description: ";
    29.   cout << record.desc << endl;
    30.   cout << "Quantity: ";
    31.   cout << record.qty << endl;
    32.   cout << "Price: ";
    33.   cout << record.price << endl;
    34.  
    35.  
    36.   cout << "Enter the new data:\n";
    37.   cout << "Description: ";
    38.   cin.ignore();
    39.   cin.getline(record.desc, DESC_SIZE);
    40.   cout << "Quantity: ";
    41.   cin >> record.qty;
    42.   cout << "Price: ";
    43.   cin >> record.price;
    44.  
    45.   // Move back to the beginning of this record's position.
    46.   inventory.seekp(recNum * sizeof(record), ios::beg);
    47.  
    48.   // Write the new record over the current record.
    49.   inventory.write(reinterpret_cast<char *>(&record),
    50.                   sizeof(record));
    51.  
    52.    
    53.   inventory.close();
    54.   return 0;
    55. }

  6. #6
    Ngày gia nhập
    12 2007
    Bài viết
    48

    Arrow Hỏi về cách Đọc/ghi vào File một (mảng) dữ liệu có cấu trúc trong C++

    1) Anh Rook cho em hỏi tí, em copy cái vd này vào máy thì xuất ra 1 file là "data.txt" nhưng dữ liệu trong đó toàn là ô vuông với mấy ký tự lạ không. Cả những vd trong box hướng dẫn nữa, khi dùng "reinterpret" ép mảng int thành char* thì in toàn ký tự lạ. Em đã save lại file txt đó thành utf-8, unicode rồi nhưng vẫn bị ô vuông?
    Ở lớp đang học đến bài này nhưng thầy không giảng phần binary T.T(Mất công tạo chủ đề mới, tiện đây em hỏi luôn ^ ^)
    Code:
    #include <iostream>
    #include <string>
    #include <fstream>
    
    struct MyData{
      std::string _mName;
      int _mAge;
    };
    
    int main()
    {
      MyData oss;
      std::fstream clientFile("data.txt", std::ios::out | std::ios::binary);
      std::cout << "Name : ";
      std::getline(std::cin, oss._mName);
      std::cout << "\nAge : ";
      std::cin >> oss._mAge;
     
      clientFile.write(reinterpret_cast<char *>(&oss), sizeof(oss)); 
      clientFile.close();
    }
    2) Em thấy không để ios::out và ios::binary thì file vẫn có chữ mà?

    Code:
    #include <iostream>
    #include <string>
    #include <fstream>
    using namespace std;
    
    const int A = 4;
    void main()
    {
    	char a[A] = "meo";
    	ofstream out;
    	out.open("data.txt");
    	if(!out)
    		exit(1);
    
    	out.write(a, sizeof(a));
    	out.close();
    }
    Đã được chỉnh sửa lần cuối bởi Emerald214 : 17-03-2008 lúc 12:57 AM.
    "what you don't use you don't pay for" (Bjarne Stroustrup).

  7. #7
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Đúng rùi đó, khi nó ghi ra là file ở dạng nhị phân, em mở ra sẽ thấy các ô vuông và 1 kí tự NULL -> end of file. Khi ghi ra file nhị phân thì em cũng phải đọc vào ở file nhị phân chứ không phải dạng file text. Vì khi em dùng ví dụ :
    C++ Code:
    1.  fstream fileReadin;
    2. fileReadin >> data;
    Toán tử >> là nó đã được overload trong C++ -> dẫn đến nó sẽ đọc vào là file luôn ở định dạng character. Cho nên khi ghi file cấu trúc nó phải dùng read và write để đọc dữ liệu ở dạng raw data.
    - Cho nên nếu em muốn đọc ghi dữ liệu đúng cách thì em phải nhập vào bằng cách của file nhị phân sau đó em dùng file này để xuất ra màn hình thì cũng phải load từ file nhị phân thì nó sẽ xuất ra đúng.
    Ở lớp đang học đến bài này nhưng thầy không giảng phần binary T.T(Mất công tạo chủ đề mới, tiện đây em hỏi luôn ^ ^)
    Chẳng có gì mất công hết T_T, hỏi dễ thương thế này thì ai thấy cũng muốn giúp .
    Còn thắc mắc chỗ nào thì anh sẽ giải thích. Muốn ví dụ thì nói cho anh biết !

  8. #8
    Ngày gia nhập
    12 2007
    Bài viết
    48

    Okie, em hiểu và làm được rồi ^ ^. Nhưng lại có 1 đống ký tự trắng phía sau, em nghĩ là do những phần tử dư của mảng tạo nên.

    Code:
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    const int A = 100;
    void main()
    {
    	char a[A] = {0};
    	ifstream in;
    	in.open("input.txt", ios::in | ios::binary);
    	if(!in)
    		exit(1);
    	in.read(a, sizeof(a));
    
    	ofstream out;
    	out.open("ouput.txt", ios::out | ios::binary);
    	if(!out)
    		exit(1);
    	out.write(a, sizeof(a));
    	out.close();	
    }
    Nên em đã dùng mảng động để không có khoảng trắng dư, và ... nó chỉ hiện 1 chữ đầu tiên trong chuỗi(nghĩa là gặp khoảng trắng thì nó kết thúc vệc ghi). (Có lẽ bây giờ không hiểu nhưng mai mốt sẽ hiểu ^ ^)

    Code:
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    const int A = 5;
    void main()
    {	
    	char *a = new char[A];
    	for(int i = 0; i < A; i++)
    		*(a + i) = 0;
    	
    	ifstream in;
    	in.open("input.txt", ios::in | ios::binary);
    	if(!in)
    		exit(1);
    	in.read(a, sizeof(a));
    
    	ofstream out;
    	out.open("ouput.txt", ios::out | ios::binary);
    	if(!out)
    		exit(1);
    	out.write(a, sizeof(a));
    	out.close();	
    	delete[] a;
    }
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    Đã được chỉnh sửa lần cuối bởi Emerald214 : 17-03-2008 lúc 08:11 PM.
    "what you don't use you don't pay for" (Bjarne Stroustrup).

Các đề tài tương tự

  1. Mã nguồn C Lỗi Cách lưu mảng cấu trúc vào File trong lập trình C?
    Gửi bởi Jino Hoang trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 06-05-2013, 01:39 PM
  2. Cách tạo một file có cấu trúc trong C++ ??????
    Gửi bởi bienxanhgoisong trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 14-05-2011, 01:42 PM
  3. Cách mở một file text có cấu trúc trong C++?
    Gửi bởi nvluong_it trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 3
    Bài viết cuối: 21-04-2011, 08:38 AM
  4. Cấu trúc file excel | Cấu trúc file xls. Giúp mình với?
    Gửi bởi knightofit trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 02-04-2009, 10:44 PM
  5. Hàm đọc và viết cấu trúc file WAV trong lập trình C++
    Gửi bởi Xcross87 trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 0
    Bài viết cuối: 14-10-2007, 12:01 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn