Lưu ý: Đây là một sửa đổi của câu trả lời được chấp nhận ở trên.
Đây là một cách để làm điều đó, hoàn thành với việc kiểm tra lỗi.
Tôi đã thêm một trình kiểm tra kích thước để thoát khi tệp lớn hơn 1 GiB. Tôi đã làm điều này vì chương trình đặt toàn bộ tệp thành một chuỗi có thể sử dụng quá nhiều ram và làm hỏng máy tính. Tuy nhiên, nếu bạn không quan tâm đến điều đó, bạn có thể xóa nó khỏi mã.
#include <stdio.h>
#include <stdlib.h>
#define FILE_OK 0
#define FILE_NOT_EXIST 1
#define FILE_TO_LARGE 2
#define FILE_READ_ERROR 3
char * c_read_file(const char * f_name, int * err, size_t * f_size) {
char * buffer;
size_t length;
FILE * f = fopen(f_name, "rb");
size_t read_length;
if (f) {
fseek(f, 0, SEEK_END);
length = ftell(f);
fseek(f, 0, SEEK_SET);
// 1 GiB; best not to load a whole large file in one string
if (length > 1073741824) {
*err = FILE_TO_LARGE;
return NULL;
}
buffer = (char *)malloc(length + 1);
if (length) {
read_length = fread(buffer, 1, length, f);
if (length != read_length) {
*err = FILE_READ_ERROR;
return NULL;
}
}
fclose(f);
*err = FILE_OK;
buffer[length] = '\0';
*f_size = length;
}
else {
*err = FILE_NOT_EXIST;
return NULL;
}
return buffer;
}
Và để kiểm tra lỗi:
int err;
size_t f_size;
char * f_data;
f_data = c_read_file("test.txt", &err, &f_size);
if (err) {
// process error
}