Tôi sẽ phá vỡ chương trình trong các tác vụ khác nhau.
Bước đầu tiên là có thể đọc một cặp dòng, dòng đầu tiên cho bạn biết số lượng số để đọc và sau đó là dòng thứ hai để đọc các số thực. Đối với điều này, một chức năng được gọi là một cái gì đó như read_set
có thể hữu ích. Nó sẽ có thể trả về các số đã đọc và kết thúc tín hiệu của tệp cũng như các lỗi. Đối với điều này, chúng ta có thể định nghĩa một cấu trúc dữ liệu như:
struct numbers {
long *data; /* or choose a type depending upon your needs */
size_t len;
};
và sau đó chúng ta có thể khai báo các chức năng của chúng tôi với nguyên mẫu:
int read_set(FILE *fp, struct numbers *num);
Chức năng sẽ phân bổ bộ nhớ cho num->data
, và thiết lập num->len
đến giá trị chính xác. Nó trả về 0 cho thành công, và một tập hợp các điều kiện lỗi khác. Chúng tôi có thể ưa thích và sử dụng enum
cho trạng thái trả lại sau. Bây giờ, giả sử 0 = thành công, 1 = kết thúc tệp và mọi thứ khác là lỗi.
Người gọi sau đó gọi read_set()
trong một vòng lặp:
struct numbers numbers;
int status;
while ((status = read_set(fp, &numbers)) == 0) {
/* process numbers->data, and then free it */
}
if (status == 1) {
/* hit end of file, everything is OK */
} else {
/* handle error */
}
Đối với việc thực hiện read_set()
: nó phải đọc hai dòng. Có rất nhiều implementations of reading a full line in C, vì vậy bạn có thể sử dụng bất kỳ trong số họ, và đọc một dòng đầu tiên, sau đó sscanf()
/strtoul()
nó cho một số (kiểm tra giá trị trả lại của nó!). Một khi bạn có số lượng các số, n
, bạn có thể đọc dòng tiếp theo trong bộ nhớ, và làm:
num->data = malloc(n * sizeof *num->data);
num->len = n;
Bạn có thể sau đó liên tục gọi sscanf()
hoặc strtol()
để lưu trữ các số trong num->data
. Bạn nên đặt trong séc để đảm bảo chính xác số n
nằm trên dòng đó.
Lưu ý rằng bạn cũng có thể viết read_set()
theo các cách khác: đọc ký tự dòng theo ký tự và phân tích cú pháp các số khi bạn đọc chúng. Điều này có lợi thế là đi qua các dữ liệu chỉ một lần, và không cần một bộ đệm lớn để lưu trữ toàn bộ dòng đầu vào trong bộ nhớ, nhưng bất lợi là làm công cụ cấp thấp bản thân và đọc dữ liệu character-by-ký tự có thể được làm chậm.
Bạn phải chú ý đến dòng, hoặc là này chỉ là một loạt các số nguyên sắp tới trong? Trong ví dụ của bạn, có vẻ như các dòng lẻ là số thứ tự và các dòng chẵn đại diện cho một số thứ khác. –
david Tôi cần chú ý đến các dòng. đó là lý do tại sao tôi không thể làm điều đó. Tôi cần ngừng nhận các giá trị mới ở cuối mỗi dòng chẵn. Vì tôi có cấu trúc với id và danh sách thuộc tính. mỗi dòng lẻ là một id và mỗi dòng đều là một danh sách. Tôi muốn điền vào một cấu trúc với 2 dòng dữ liệu và di chuyển đến cấu trúc khác và điền nó với 2 dòng dữ liệu khác ... – huhuhuuu
Đọc toàn bộ dòng tại một thời điểm và sau đó phân tích cú pháp như một chuỗi –