char source[1000000];
FILE *fp = fopen("TheFile.txt", "r");
if(fp != NULL)
{
while((symbol = getc(fp)) != EOF)
{
strcat(source, &symbol);
}
fclose(fp);
}
Có khá một vài điều sai với mã này:
- Nó rất chậm (bạn đang chiết xuất nhân vật đệm cùng một lúc).
- Nếu kích thước tệp vượt quá
sizeof(source)
, điều này dễ bị tràn bộ đệm.
- Thực sự, khi bạn xem xét kỹ hơn, mã này sẽ không hoạt động. Như đã trình bày trong các trang người đàn ông:
Chức năng strcat()
gắn thêm một bản sao của chuỗi null-chấm dứt s2 đến cuối của chuỗi s1 null-chấm dứt, sau đó thêm một chấm dứt `\ 0' .
Bạn đang bổ sung một nhân vật (không phải là một chuỗi NUL-chấm dứt!) Thành một chuỗi có thể có hoặc không có thể NUL-chấm dứt. Các chỉ thời gian tôi có thể tưởng tượng này làm việc theo mô tả man-page là nếu mỗi nhân vật trong tập tin là NUL chấm dứt, trong trường hợp này sẽ là khá vô nghĩa. Vì vậy, có, đây chắc chắn là một sự lạm dụng khủng khiếp của strcat()
.
Sau đây là hai lựa chọn thay thế để xem xét sử dụng thay thế.
Nếu bạn biết kích thước bộ đệm tối đa trước thời hạn:
#include <stdio.h>
#define MAXBUFLEN 1000000
char source[MAXBUFLEN + 1];
FILE *fp = fopen("foo.txt", "r");
if (fp != NULL) {
size_t newLen = fread(source, sizeof(char), MAXBUFLEN, fp);
if (ferror(fp) != 0) {
fputs("Error reading file", stderr);
} else {
source[newLen++] = '\0'; /* Just to be safe. */
}
fclose(fp);
}
Hoặc, nếu bạn không:
#include <stdio.h>
#include <stdlib.h>
char *source = NULL;
FILE *fp = fopen("foo.txt", "r");
if (fp != NULL) {
/* Go to the end of the file. */
if (fseek(fp, 0L, SEEK_END) == 0) {
/* Get the size of the file. */
long bufsize = ftell(fp);
if (bufsize == -1) { /* Error */ }
/* Allocate our buffer to that size. */
source = malloc(sizeof(char) * (bufsize + 1));
/* Go back to the start of the file. */
if (fseek(fp, 0L, SEEK_SET) != 0) { /* Error */ }
/* Read the entire file into memory. */
size_t newLen = fread(source, sizeof(char), bufsize, fp);
if (ferror(fp) != 0) {
fputs("Error reading file", stderr);
} else {
source[newLen++] = '\0'; /* Just to be safe. */
}
}
fclose(fp);
}
free(source); /* Don't forget to call free() later! */
Điều này là sai. 'strcat' nối chuỗi. Ngay cả khi '& symbol' là một' char * ', nó không phải là null-terminated. Bạn nên sử dụng 'fgets' hoặc' fread'. Ngoài ra, 'strcat' sẽ chậm trong trường hợp của bạn vì nó quét' nguồn' mỗi khi cần thêm một ký tự. –
Có, bạn đang lạm dụng strcat. Làm ơn. Dừng lại đi. Lạm dụng mèo là sai. –
Không đề cập đến việc đọc một char tại một thời điểm sẽ chậm hơn nhiều so với sử dụng 'fread'. –