2
Cách đọc mảng từ tập tin không biết trước số lượng phần tử trong C/C++?
0
Minh Itus0 đã đăng:

Chào các bạn, mình dùng ngôn ngữ lập trình C để đọc một tập tin tên data.txt có cấu trúc như sau,

5
54 15 32 85 18

Trong đó:

  • Dòng đầu tiên là số lượng phần tử của mảng.
  • Dòng thứ hai là các giá trị của mảng.

Khi mình đọc tập tin trên, mình đọc số lượng phần tử của mảng trước, lưu vào n, sau đó dùng vòng lặp for chạy từ 0 đến n để đọc từng giá trị lên mảng.

Bây giờ tập tin của mình không biết trước số lượng phần tử n mà chỉ còn như sau,

54 15 32 85 18

Cho mình hỏi làm sao để đọc chính xác tập tin không biết trước số lượng phần tử này vậy các bạn? Cảm ơn các bạn.

Bạn có thể tham khảo cách khởi tạo mảng không biết trước số lượng phần tử trong C, từ đó bạn có thể mở rộng cho file, mình nghĩ khá tương tự, chỉ cần thay đổi một chút.

Cộng đồng 25.02.2020
thêm bình luận...
0
Member462840 đã đăng:

Mình nghĩ là đếm số lượng phần tử có trong file trước, cấp phát bộ nhớ cho mảng dựa vào số lượng phần tử đã đếm được, sau đó quay trở lại để đọc dữ liệu từ file, mặc dù nó có hơi simple và naive nhưng cũng có thể hoạt động đúng.

#include <stdio.h>

int main()
{
    int *A;
    int n = 0;
    int number;
    FILE *f = fopen("input.txt", "r");

    // Dem so luong phan tu co trong file
    while (fscanf(f, "%d", &number) > 0)
        n++;

    // Cap phat bo nho cho mang A
    A = new int[n];

    // Quay tro lai file de doc du lieu vao mang A
    fseek(f, 0, SEEK_SET);
    for (int i = 0; i < n; i++)
        fscanf(f, "%d", &A[i]);

    // Xuat mang da doc
    for (int i = 0; i < n; i++)
        printf("%5d", A[i]);
}

Cho mình hỏi mục đích của hàm fseek(f, 0, SEEK_SET) để làm gì vậy, mình thử bỏ nó ra thì chương trình chạy bị sai.

Việt Cuponi 26.03.2019

Bởi vì lúc đầu mình đã dùng con trỏ file f để đếm số lượng phần tử có trong file trước, sau khi đếm xong, con trỏ file f nằm ở vị trí cuối cùng của dữ liệu, cho nên mình phải di chuyển con trỏ file f lại về vị trí lúc xuất phát, tức là vị trí lúc ban đầu thì mới có thể đọc lại dữ liệu lần nữa được, hàm fseek giúp mình làm được điều này.

Hàm fseek nhận vào tham số là con trỏ file f, SEEK_SET có ý nghĩa bắt đầu lại từ đầu file, và 0 có nghĩa là bắt đầu lại từ vị trí thứ 0, ý nghĩa chung đó là di chuyển con trỏ file f về lại vị trí thứ 0 ở đầu file.

Nếu bạn bỏ câu lệnh này, tức là không di chuyển con trỏ file f thì kết quả sẽ bị sai, do con trỏ file f sẽ tiếp tục đi, mà tiếp tục đi thì làm gì còn dữ liệu nào nữa để đọc, kết quả là mảng toàn giá trị rác.

Member4628 26.03.2019

Nếu có 2 mảng không có số phần tử thì làm thế nào vậy bạn.?

Cộng đồng 25.02.2020

Mình thấy cách trên phải xác định số lượng phần tử trước khi đọc mảng cho nên nếu bài toán yêu cầu 2 mảng trong cùng 1 file thì đôi khi hàm fseek sẽ cho kết quả không chính xác. Mình suggest cách tạo mảng động theo số lượng số phần tử, tức là mỗi khi có phần tử mới, mảng sẽ tự động cấp phát thêm một ô nhớ để lưu trữ, do đó, khi đọc file, bạn có thể đi 1 lần từ đầu đến cuối không cần sử dụng hàm fseek để quay lại.

Cộng đồng 25.02.2020

Cho mình hỏi là lệnh: while (fscanf(f, "%d", &number) > 0) Vậy khi đọc hết file là giá trị đọc được trong file sẽ trả về số <0 à?

Cộng đồng 12.04.2020

Đúng rồi bạn, khi đọc hết file thì hàm sẽ trả về giá trị -1, bình thường hàm sẽ trả về giá trị 1. Đó là lí do tại sao bạn trên kia check điều kiện lớn hơn hoặc bé hơn 0.

Cộng đồng 14.04.2020
thêm bình luận...
0
Cộng đồng đã đăng:

Chỉ cần dùng int i=0; While (cin<<a[i]) {i++;}<="" p="">

thêm bình luận...
Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)