C程序:按字母顺序排列文本文件

时间:2015-10-25 05:43:39

标签: c sorting text-files

我是文件处理的新手,想要一些帮助阅读带有记录的文本文件,其中包含姓名,地址,城市,州,邮政编码和电话号码,所有人都用“\ t”分隔,并且将其复制到另一个文件中。读取的文件可以包含任意数量的记录。

我希望能够按字母顺序按城市排序这些记录。我是文件处理的新手,所以我不知道如何阅读文件以及如何在我的比较功能中进行此操作。此外,在我的代码中,我有一些注释掉的代码,用于显示每个文件包含的内容。我的问题是它没有被注释掉,并且是文本文件没有复制到目标文件的程序的一部分。那是为什么?

提前感谢您的帮助!我的代码在这里:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct contacts {
    char fname[1000];
    char lname[1000];
    char address[1000];
    char city[1000];
    char state[1000];
    char zip[1000];
    char num[1000];
}ContactType;

#define MaxContacts 1000
ContactType contacts[MaxContacts];
int ncontacts = 0;// update to number of records stored in contacts[] 

int CompareCity(void *pa, void *pb);

int main()
{
    char ch, copy, show, source_file[1000], target_file[1000];
    FILE *source, *target;

    printf("Enter name of file to copy\n");
    gets(source_file);

    source = fopen(source_file, "r");

    if (source == NULL)
    {
        printf("Could not open file.\n");
        exit(EXIT_FAILURE);
    }

    printf("Enter name of target file\n");
    gets(target_file);

    target = fopen(target_file, "w");

    if (target == NULL)
    {
        fclose(source);
        printf("Could not open file\n");
        exit(EXIT_FAILURE);
    }

    printf("The contents of %s file are :\n", source_file);

    /*while ((ch = fgetc(source)) != EOF)
        printf("%c", ch);
    printf("\n");*/

    qsort(contacts, ncontacts, sizeof contacts[0], CompareCity);

    while ((copy = fgetc(source)) != EOF)
        fputc(copy, target);

    printf("File copied successfully.\n");

    printf("The contents of %s file are :\n", target_file);

    /*while ((show = fgetc(target)) != EOF) 
        printf("%c", show);
    printf("\n");*/

    fclose(source);
    fclose(target);

    return 0;
}

int CompareCity(void *pa, void *pb) {

    return strcmp(((ContactType*)pa)->city, ((ContactType*)pb)->city);
}

1 个答案:

答案 0 :(得分:0)

回答有关评论代码的问题:

每个打开的文件都有file pointer的概念,表示读/写操作的当前位置。

第一个评论代码:

while ((ch = fgetc(source)) != EOF)
    printf("%c", ch);
printf("\n");

从文件中输入所有字符后,文件指针位于文件的末尾。

以上代码尝试通读该文件。但是,文件指针已经在文件的末尾。

建议使用rewind()(或更好)lseek()在读取/解析/排序文件之前将文件指针移回文件的开头。

第二个评论代码:

while ((show = fgetc(target)) != EOF) 
    printf("%c", show);
printf("\n");

有一个类似的问题,同样,文件指针已经在新文件的末尾。

BTW:fgetc()返回一个'int',EOF是一个int,因此ch的声明和show的声明必须是'int'而不是'char'。并且EOF与'char'没有正确比较。处理声明为'int'而不是'char'时,不需要对代码进行其他更改。