使用数组读取和写入文本文件

时间:2014-02-05 02:29:46

标签: c arrays sorting text-files

我正在使用C语言编写一个类的程序而且我被卡住了。我一直在研究各地(教科书,互联网,同学,课堂笔记),我似乎无法找到问题。以下是以下任务:

编写一个读取输入文件并创建已排序输出文件的函数。函数原型是void file_sort(char * infile,char * outfile)。该函数将文件名作为参数。输入文件包含学生信息,格式如下。第一行包含文件中的学生数。每个后续行包含有关一名学生的信息。每行包含三个字段,即学生ID,成绩和GPA,按空格分隔。学生ID是正整数。成绩是一个角色。 GPA是双重类型值。该功能按学生ID的升序对学生信息进行排序。已订购的学生信息将写入输出文件。输出文件的格式与输入文件的格式相同。该函数动态分配三个数组并将学生信息存储到数组中。三个阵列同时排序。已排序的数组信息将写入输出文件。当函数完成其工作时,将释放动态数组。不应使用结构。

只是几个笔记: (1)我用Java语言编程了大约3年。编程对我来说不一定是新的。然而,C语言。 (2)如果我没有正确提出我的问题,你当然可以这样说,但请体谅。毕竟,我仍然认为自己是“新手”。

这是我目前的代码。第一个块是我在main中调用函数file_sort()。它是菜单驱动的(用户选择1-11个选项。这是选项9)。

else if (response == 9)
    {
        char *input_file_name;
        char *output_file_name;
        printf("Enter input file name: ");
        scanf("%s", input_file_name);
        printf("Enter output file name: ");
        scanf("%s", output_file_name);
        file_sort(input_file_name, output_file_name);
        printf("File sorted and rewritten\n");
    }

这是在main之外声明的函数。

void file_sort(char *infile, char *outfile)
{
    FILE *input;
    FILE *output;
    input = fopen(infile, "r");
    output = fopen(outfile, "w");
    int size = 100;
    int *id_array;
    id_array = (int*)malloc(size*sizeof(int));
    char *grade_array;
    grade_array = (char*)malloc(size*sizeof(char));
    double *gpa_array;
    gpa_array = (double*)malloc(size*sizeof(double));
    char grade;
    int id;
    double gpa;
    int number_students, j;
    if (input == NULL)
    {
        printf("File could not be opened\n");
    }
    fscanf(input, "%d", &number_students);
    while ((fscanf(input,"%d %c %lf", &id, &grade, &gpa)) == 3)
    {
        j = number_students;
        while((j >= 0) && (id_array[j] > id))
        {
            if (id_array[0] == 0)
            {
                id_array[0] = id;
                break;
            }
            id_array[j + 1] = id_array[j];
            j--;
        }
        if (j < 0)
        {
            j = 0;
        }
        id_array[j] = id;
        gpa_array[j] = gpa;
        grade_array[j] = grade;
    }

    int i;
    for (i = 0; i <= number_students; i++)
    {
        fprintf(output, "%d %c %lf\n", id_array[i], grade_array[i], gpa_array[i]);
    }
    free(id_array);
    free(grade_array);
    free(gpa_array);
    fclose(input);
    fclose(output);
}

如果我需要提供任何信息以帮助更好地回答这个问题,请告知我们。非常感谢你。

看来排序不起作用。下面我发布了需要与最终输出一起排序的文件。

要排序(第一个数字声明学生数量):

5
6029 A 3.5
3920 B 2.3
9287 A 3.1
1029 C 1.7
8391 B 2.9
运行后

“已排序”文件:

1029 C 1.700000
8391 B 2.900000
9287 £ 0.000000
9287   0.000000
10696720 ¸ 0.000000
10696720  0.000000'

???

2 个答案:

答案 0 :(得分:0)

我不确定确切的问题。

一个明显的问题出在else if (response == 9)部分

char *input_file_name;
char *output_file_name;

是char指针。这些指针用于获取文件名。但是没有为此分配内存。

else if (response == 9)
    {
        char *input_file_name; <------
        char *output_file_name;
        printf("Enter input file name: "); 
        scanf("%s", input_file_name);<--------------
        printf("Enter output file name: ");
        scanf("%s", output_file_name);<--------------
        file_sort(input_file_name, output_file_name);
        printf("File sorted and rewritten\n");
    }

动态分配或将其设为char数组。

char input_file_name[50];
char output_file_name[50];

答案 1 :(得分:-2)

我不知道,但也许你也可以这样做?

int i; for (i = 0; i <= number_students; i++, i--) {