2011-10-22 27 views
13

thể trùng lặp:
Easiest way to get file's contents in CLàm thế nào tôi có thể tải toàn bộ một tập tin vào một chuỗi trong C

chương trình của tôi đọc file mà span trên nhiều dòng. Tôi muốn giữ nội dung của một tập tin trong một chuỗi duy nhất.

Tôi không biết số dòng tệp của mình trước khi thực thi, tuy nhiên tôi đã cố định kích thước đường là MAX_LINE_LEN.

Bạn có thể làm như thế nào?

+1

điều này đã được hỏi ít nhất một trăm lần, tôi đoán – akappa

Trả lời

26

Chức năng fread() không quan tâm về ngắt dòng. Các mã sau đây sẽ đọc nội dung của input_file_name và lưu chúng vào mảng file_contents:

char *file_contents; 
long input_file_size; 
FILE *input_file = fopen(input_file_name, "rb"); 
fseek(input_file, 0, SEEK_END); 
input_file_size = ftell(input_file); 
rewind(input_file); 
file_contents = malloc(input_file_size * (sizeof(char))); 
fread(file_contents, sizeof(char), input_file_size, input_file); 
fclose(input_file); 

Bạn chỉ có thể thực hiện một chuỗi các mảng này nếu input_file_name chứa các nhân vật \0. Nếu không, hãy thay đổi ba dòng cuối cùng thành:

file_contents = malloc((input_file_size + 1) * (sizeof(char))); 
fread(file_contents, sizeof(char), input_file_size, input_file); 
fclose(input_file); 
file_contents[input_file_size] = 0; 
+1

+1 nhưng thay đổi 'long long' thành' size_t' hoặc ít nhất sử dụng 'long', loại trả về thực tế của' ftell'. –

+0

Xong. Cảm ơn sự quan sát. @rahmu: Điều đó có nghĩa rằng, nếu 'sizeof (long) == 4', thì ở trên sẽ chỉ hoạt động đối với các tệp nhỏ hơn 4 GiB. – Dennis

+0

Ngoài ra, không nên dòng cuối cùng là 'file_contents [input_file_size + 1] = '\ 0';'? – Chris

3

1) tìm ra kích thước của tệp với fstat.

2) alloc một bộ đệm zeroed chiều dài này + 1

3) sử dụng fread đọc nội dung tập tin vào bộ đệm

+0

4) Thêm một terminator rỗng vào cuối. (EDIT: Được rồi, tôi thấy bạn nói "zeroed buffer", nhưng tại sao dành tất cả thời gian zeroing mỗi byte nếu bạn ghi đè lên nó không? Không phải là nó quan trọng trong cuộc sống thực, nhưng vẫn còn.) – EboMike

+0

điểm công bằng. mặc dù tôi muốn lập luận rằng thời gian đưa đến không một bộ đệm là không đáng kể so với chi phí I/O trừ khi tập tin là rất lớn. Người dùng chỉ có thể là byte cuối cùng. – James

+1

Nếu bạn sử dụng 'calloc', trên hầu hết các hệ điều hành, nó sẽ có cùng tốc độ với' malloc' vì hệ điều hành thực hiện điều gì đó ở chế độ nền để đảm bảo bộ nhớ được zero-out (để đảm bảo 'calloc (8 * getpagesize()) 'không mất mãi mãi), nhưng tất nhiên, nó không đảm bảo. –

Các vấn đề liên quan