我编写了一个小程序来格式化文本文件。到目前为止,我对我的程序的结果非常满意。不可接受的是编译和执行所需的时间。编译需要6秒,执行则需要更长的时间。是
fgetc
的问题吗?
读取到的文件内容为
Hartman-Montgomery, Jane R.
Doe, J. D.
代码:
#include <stdio.h>
#define LENGTH_FIRST_NAME 10
#define LENGTH_SUR_NAME 15
#define NUMBER_NAMES 2
void get_data(FILE *file_ptr, char first[][LENGTH_FIRST_NAME], char middle[][LENGTH_FIRST_NAME], char surname[][LENGTH_SUR_NAME], int number_items);
int main()
{
char first[NUMBER_NAMES][LENGTH_FIRST_NAME] = {0},
middle[NUMBER_NAMES][LENGTH_FIRST_NAME] = {0},
surname[NUMBER_NAMES][LENGTH_SUR_NAME] = {0};
FILE *file_ptr;
if((file_ptr = fopen("names.txt", "r")) != 0)
puts("--File Found--");
else
puts("--File not Found--");
get_data(file_ptr, first, middle, surname, NUMBER_NAMES);
/*for(int i = 0; i < NUMBER_NAMES; i++)
{
printf("%s", first[i]);
printf("%20s", middle[i]);
printf("%20s\n", surname[i]);
}*/
fclose(file_ptr);
return 0;
}
void get_data(FILE *file_ptr, char first[][LENGTH_FIRST_NAME], char middle[][LENGTH_FIRST_NAME], char surname[][LENGTH_SUR_NAME], int number_items)
{
int ch = 0,
i = 0;
for(int j = 0; j < number_items; j++)
{
i = 0;
while((ch = fgetc(file_ptr)) != ',' && i < LENGTH_FIRST_NAME - 1)
first[j][i++] = ch;
first[j][i] = '\0';
while(ch != ' ')
ch = fgetc(file_ptr);
i = 0;
while((ch = fgetc(file_ptr)) != ' ')
middle[j][i++] = ch;
middle[j][i] = '\0';
while(ch != ' ')
ch = fgetc(file_ptr);
i = 0;
while((ch = fgetc(file_ptr)) != '\n' && i < LENGTH_SUR_NAME - 1 && ch != EOF)
surname[j][i++] = ch;
surname[j][i] = '\0';
}
}
考虑一个包含相关数组的结构。传递单个结构数组比传递多个数组更好。
尝试使用
fgets
读取一行,然后使用 sscanf
进行解析。%n
跟踪线路的进度。它提供了扫描到 %n
说明符点所处理的字符数。
#include <stdio.h>
#define LENGTH_FIRST_NAME 9
#define LENGTH_SUR_NAME 14
#define NUMBER_NAMES 2
#define SIZE 100
// stringify to use in format string
#define FS(x) SFS(x)
#define SFS(x) #x
typedef struct person_s {
char first[LENGTH_FIRST_NAME + 1];
char middle[LENGTH_FIRST_NAME + 1];
char surname[LENGTH_SUR_NAME + 1];
} person_t;
void get_data(FILE *file_ptr, person_t *person, int number_items);
int main()
{
char *filename = "names.txt";
FILE *file_ptr;
person_t person[NUMBER_NAMES] = { 0};
if ( NULL != ( file_ptr = fopen ( filename, "r"))) {
puts ( "--File Found--");
}
else {
perror ( filename);
return 1;
}
get_data ( file_ptr, person, NUMBER_NAMES);
for(int i = 0; i < NUMBER_NAMES; i++)
{
printf("%12s", person[i].first);
printf("%20s", person[i].middle);
printf("%20s\n", person[i].surname);
}
fclose ( file_ptr);
return 0;
}
void get_data(FILE *file_ptr, person_t *person, int number_items) {
char line[SIZE] = "";
int used = 0;
int offset = 0;
int count = 0;
while ( count < number_items && fgets ( line, sizeof line, file_ptr)) {
offset = 0;
used = 0;
if ( 1 != sscanf ( line + offset, " %"FS(LENGTH_FIRST_NAME)"[^,]%n", person[count].first, &used)) {
break;
}
offset += used;
used = 0;
sscanf ( line + offset, "%*[^ ]%n", &used);
offset += used;
used = 0;
if ( 1 != sscanf ( line + offset, " %"FS(LENGTH_FIRST_NAME)"[^ ]%n", person[count].middle, &used)) {
break;
}
offset += used;
used = 0;
if ( 1 != sscanf ( line + offset, " %"FS(LENGTH_SUR_NAME)"[^\n]", person[count].surname)) {
break;
}
++count;
}
}