编译和执行时间长

问题描述 投票:0回答:1

我编写了一个小程序来格式化文本文件。到目前为止,我对我的程序的结果非常满意。不可接受的是编译和执行所需的时间。编译需要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';

    }
}
c string
1个回答
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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.