我是文件处理的新手,想要一些帮助阅读带有记录的文本文件,其中包含姓名,地址,城市,州,邮政编码和电话号码,所有人都用“\ 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);
}
答案 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'时,不需要对代码进行其他更改。