我有一个我要编写的程序,该程序将打开一个名为list.txt的文件,此文件将在每行上包含一个num,id和一个字符串名称。此程序将读取list.txt文件,然后对ID号进行排序,并打印出具有数字和名称的INDEX.txt文件的ID。我写了一个程序代码,它正在工作...
这是我的列表.txt
(num,id,name)
0 3 AB
1 2 BC
2 28 DC
3 1 EF
4 13 BB
10 30 CC
11 23 FF
14 16 GG
编译了此程序排序的ID和名称,请打印到index.txt,应该是:
(id,num,name)
1 3 EF
2 1 BC
3 0 AB
13 4 BB
16 14 GG
23 11 FF
28 2 DC
30 10 CC
这是我的程序代码:
#include <stdio.h>
#include <conio.h>
#include <process.h>
#include <stdlib.h>
#include <string.h>
#define NUM_NUMBERS 9
typedef struct student
{
int num;
int id;
char name[100];
}end;
void update();
void Sort(student array[], int n);
void load_menu();
void add(end *e);
void search(end e);
void view(end e);
FILE *fp;
FILE *f1;
int main(int argc, char** argv)
{
load_menu();
return 0;
}
void update()
{
end st[15];
int sayi[NUM_NUMBERS], number, i=0, j=0;
fp=fopen("list.txt", "r");
if( fp == NULL )
{
printf("File is not found at add();n");
exit(0);
}
while(!feof(fp))
{
fscanf(fp,"%d%d%s",&st[i].num,&st[i].id,st[i].name);
i++;
}
Sort(st, NUM_NUMBERS);
f1=fopen("index.txt", "w");
for(int i=0; i<NUM_NUMBERS;i++)
{
fprintf(f1, "%d %d %sn", st[i].id, st[i].num, st[i].name);
}
}
void Sort(end array[], int n)
{
int Min;
for(int i=0; i<n-1;i++)
{
Min=i;
for(int j=i+1;j<n;j++)
{
if(array[j].id<array[Min].id)
{
Min=j;
}
}
end temp=array[i];
array[i]=array[Min];
array[Min]=temp;
}
}
void load_menu(void)
{
end e;
int choice;
do
{
printf("1. Find a record given its ID value n");
printf("2. Add a new record to the file n");
printf("3. View Recordsn");
printf("4. Exitnn");
printf("Please choose one: ");
scanf("%d",&choice);
switch(choice)
{
case 1:
search(e);
break;
case 2: add(&e);
update();
break;
case 3: view(e);
break;
case 4: printf("Done.");
return;
break;
default: printf("Invalid choicen");
}
}while (choice != 5);
system("cls");
}
void add(end *e)
{
int i=0;
system("cls");
fp = fopen ( "list.txt", "a" );
if( fp == NULL )
{
printf("File is not found at add();n");
exit(0);
}
printf("n-----Add a new record-----n");
printf("Enter number: ");
scanf("%d", &e->num);
printf("nEnter ID : ");
scanf("%d",&e->id);
printf("nEnter name: ");
scanf("%s",e->name);
fscanf(fp,"%d %d %snn",&e->num, &e->id, e->name);
fprintf(fp,"%d %d %snn",e->num ,e->id, e->name);
fclose(fp);
return;
}
void search(end e)
{
int i=0;
int sid;
system("cls");
fp = fopen ("list.txt", "r");
if(fp==NULL)
{
printf("File is not found at search();");
}
printf("n-----Search ID-----n");
printf("nEnter ID : ");
scanf("%d",&sid);
printf("nNumber ID Name");
while(!feof(fp))
{
fscanf(fp,"%d %d %s", &e.num, &e.id, &e.name);
if(sid==e.id)
{
printf("n%d %d %s",e.num ,e.id, e.name);
}
}
printf("nn");
fclose(fp);
}
void view(end e)
{
int i=0;
system("cls");
printf("n-----list.txt-----n");
fp = fopen("list.txt", "r");
if(fp == NULL)
{
printf("File is not found at view();n");
exit(0);
}
printf("nNumber ID Name");
printf("n");
while(fscanf (fp, "%d %d %s ",&e.num, &e.id, &e.name) != EOF )
printf("n%d %d %s",e.num ,e.id, e.name);
printf("nn");
printf("-----index.txt-----n");
f1 = fopen("index.txt", "r");
if(fp == NULL)
{
printf("File is not found.n");
exit(0);
}
printf("nNumber ID Name");
printf("n");
while(fscanf (f1, "%d %d %s ",&e.id, &e.num, &e.name) != EOF )
printf("n%d %d %s",e.id ,e.num, e.name);
printf("nn");
fclose(fp);
fclose(f1);
return;
}
,但我只使用数组,因此我需要在结构数组中动态分配以存储信息。仍然不知道如何动态分配(malloc)。您能告诉我如何与代码动态使用吗?感谢您的帮助。(对不起,英语不好。)
示例代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct student{
int num;
int id;
char name[100];
}end;
int cmp(void const *a, void const *b){
const end *x = a;
const end *y = b;
return x->id < y->id ? -1 : x->id > y->id;
}
int main(void){
end *st = NULL, tmp;
FILE *fp;
size_t i = 0, n = 0;
fp=fopen("list.txt", "r");
if( fp == NULL ) {
perror("fopen at XXX");
exit(EXIT_FAILURE);
}
while(3 == fscanf(fp,"%d %d %s", &tmp.num, &tmp.id, tmp.name)){
end *temp = realloc(st, ++n * sizeof(*st));//Secure multiple records when the number of records is large
if(temp == NULL){
perror("realloc at XXX");
free(st);
exit(EXIT_FAILURE);
}
st = temp;
st[i++] = tmp;
}
fclose(fp);
qsort(st, n, sizeof(*st), cmp);
fp=fopen("index.txt", "w");
for(i = 0; i < n; ++i){
fprintf(fp, "%d %d %sn", st[i].id, st[i].num, st[i].name);
}
fclose(fp);
free(st);
}
malloc()返回指向您分配的内存的指针。参数是您要分配的内存的大小,因此在您的情况下,它的大小是" end"的大小。
您需要先声明"结束"指针,然后致电malloc()。
end * ptr = malloc(sizeof(end));
但这只是一个元素。您绝对应该查看c。