Giả sử bạn đang làm việc với một số delimiter khác, chẳng hạn như một tab \t
, thay vì một dòng mới \n
.
Cách tiếp cận tổng quát hơn đối với dấu phân tách là sử dụng getc()
, mỗi lần lấy một ký tự.
Lưu ý rằng getc()
trả về một int
, để chúng tôi có thể kiểm tra sự bình đẳng với EOF
.
Thứ hai, chúng ta định nghĩa một mảng line[BUFFER_MAX_LENGTH]
loại char
, để lưu trữ lên đến BUFFER_MAX_LENGTH-1
ký tự trên stack (chúng ta phải tiết kiệm mà ký tự cuối cùng cho một nhân vật \0
terminator).
Sử dụng một mảng tránh nhu cầu sử dụng malloc
và free
để tạo con trỏ ký tự có độ dài phù hợp trên heap.
#define BUFFER_MAX_LENGTH 1024
int main(int argc, char* argv[])
{
FILE *file = NULL;
char line[BUFFER_MAX_LENGTH];
int tempChar;
unsigned int tempCharIdx = 0U;
if (argc == 2)
file = fopen(argv[1], "r");
else {
fprintf(stderr, "error: wrong number of arguments\n"
"usage: %s textfile\n", argv[0]);
return EXIT_FAILURE;
}
if (!file) {
fprintf(stderr, "error: could not open textfile: %s\n", argv[1]);
return EXIT_FAILURE;
}
/* get a character from the file pointer */
while(tempChar = fgetc(file))
{
/* avoid buffer overflow error */
if (tempCharIdx == BUFFER_MAX_LENGTH) {
fprintf(stderr, "error: line is too long. increase BUFFER_MAX_LENGTH.\n");
return EXIT_FAILURE;
}
/* test character value */
if (tempChar == EOF) {
line[tempCharIdx] = '\0';
fprintf(stdout, "%s\n", line);
break;
}
else if (tempChar == '\n') {
line[tempCharIdx] = '\0';
tempCharIdx = 0U;
fprintf(stdout, "%s\n", line);
continue;
}
else
line[tempCharIdx++] = (char)tempChar;
}
return EXIT_SUCCESS;
}
Nếu bạn phải sử dụng một char *
, sau đó bạn vẫn có thể sử dụng mã này, nhưng bạn strdup()
mảng line[]
, một khi nó được lấp đầy với giá trị của một dòng đầu vào. Bạn phải free
chuỗi trùng lặp này sau khi bạn đã hoàn tất hoặc bạn sẽ bị rò rỉ bộ nhớ:
#define BUFFER_MAX_LENGTH 1024
int main(int argc, char* argv[])
{
FILE *file = NULL;
char line[BUFFER_MAX_LENGTH];
int tempChar;
unsigned int tempCharIdx = 0U;
char *dynamicLine = NULL;
if (argc == 2)
file = fopen(argv[1], "r");
else {
fprintf(stderr, "error: wrong number of arguments\n"
"usage: %s textfile\n", argv[0]);
return EXIT_FAILURE;
}
if (!file) {
fprintf(stderr, "error: could not open textfile: %s\n", argv[1]);
return EXIT_FAILURE;
}
while(tempChar = fgetc(file))
{
/* avoid buffer overflow error */
if (tempCharIdx == BUFFER_MAX_LENGTH) {
fprintf(stderr, "error: line is too long. increase BUFFER_MAX_LENGTH.\n");
return EXIT_FAILURE;
}
/* test character value */
if (tempChar == EOF) {
line[tempCharIdx] = '\0';
dynamicLine = strdup(line);
fprintf(stdout, "%s\n", dynamicLine);
free(dynamicLine);
dynamicLine = NULL;
break;
}
else if (tempChar == '\n') {
line[tempCharIdx] = '\0';
tempCharIdx = 0U;
dynamicLine = strdup(line);
fprintf(stdout, "%s\n", dynamicLine);
free(dynamicLine);
dynamicLine = NULL;
continue;
}
else
line[tempCharIdx++] = (char)tempChar;
}
return EXIT_SUCCESS;
}
Mã này thậm chí không được biên dịch. 'sscanf (dòng, tên tập tin,"% s ");' nên là 'sscanf (dòng, tập tin,"% s ");' – Mawg
Lưu ý rằng ['while (! feof (file))' luôn luôn sai] (http : //stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong). –
Có thể trùng lặp của [C đọc tập tin dòng theo dòng] (https://stackoverflow.com/questions/3501338/c-read-file-line-by-line) –