作者:幸福的哈瑞宝 | 来源:互联网 | 2023-05-17 11:36
小女子初学C语言,有个关于文件的问题请教大家。
问题如下:
testA
员工工资表
姓名 工号 部门编号 工资(单位:元)
张三 1001 001 2500
李四 1002 001 3000
王五 1008 002 2500
赵六 1005 003 4000
李七 1006 002 3500
钱八 1003 002 3500
孙九 1007 003 4500
testB
1 员工工资表
2 姓名 工号 部门编号 工资(单位:元)
3 张三 1001 001 2500
4 李四 1002 001 3000
5 钱八 1003 002 3500
6 赵六 1005 003 4000
7 李七 1006 002 3500
8 孙九 1007 003 4500
9 王五 1008 002 2500
注:按工号排序。
请问怎样用C语言实现读取testA文件,按工号排序写入testB文件里,并在B里显示出行号?谢谢大家!
22 个解决方案
你刚初学就碰到这个题目。我想问一下你学了多久了啊?
我先给你一个类似的问题。
函数ELEM *proc(FILE *fp)从文件fp中逐个读入职工的工号及其完成的产品数量,对相同工号的产品数量计入该职工完成的产品总数,并且按照产品总数降序排列,若多个职工完成的产品总数相同,则按工号升序排列。
函数中建立了一个有序链表,来存储每个职工的工号和完成产品总数等数据,其结点类型为:
typedef struct ELE{
int no; /*职工工号*/
int num; /*完成的产品总数*/
struct ELE *next;
}ELEM;
[函数3]
ELEM *proc(FILE *fp)
{ int m,n;
ELEM *u,*v,*p,*base;
base = NULL; /*base是链表的首指针*/
while(fscanf(fp,"%d%d",&n,&m) == 2){
/*链表中是否存在工号为n的结点*/
for(v = base;v != NULL && v->no != n; __(1)___);
if(v != NULL) {/*若链表中已有工号为n的结点v,则将其从链表中脱钩*/
if(__(2)__ base = v->next;
else u->next = v->next;
v->num += m; /*累加工号为n的职工完成的产品数量*/
}
else { /*创建一个工号为n的结点*/
v = (ELEM *)malloc(sizeof(ELEM));
v->no = n; v->num = m;
}
/* 寻找结点v的插入位置*/
p = base;
while(p != NULL)
if(v->num > p->num || v->num == p->num && ___(3)___) break;
else {u = p; p = p->next; }
/* 将结点v插入链表*/
if(p == base) __(4)__;
else u->next = v;
__(5)__;
}
return base;
}
答案是:
(1) u = v,v = v->next 或 u = v,v = u->next
(2) v == base 或 base->no == n
(3) v->no < p->no 或 v->no <= p->no
(4) base = v
(5) v->next = p
我最近刚跳槽到一家公司,我以前是做数据库开发的,现在做C、 vc、JAVA方面的编程。我现在就遇到这么一个问题,好头痛!
谢谢你,雪村。
用鏈表作,確實很容易,但是文件操作我一點都不熟悉!!過些日子要多練習文件操作才行,大家一起進步!!!
尝试做了一下,做的不好请见谅
#include
#include
#include
#define MAXLINE 100
typedef struct
{
char name[10];
int id;
char depart[6];
int money;
}salary;
void myswap(salary* s1, salary* s2)
{
salary s;
int len= sizeof(salary);
if(s1 != s2)
{
memcpy(&s, s1, len);
memcpy(s1, s2, len);
memcpy(s2, &s, len);
}
}
salary* paixu(salary* mysal, int num)
{
int i;
for(i=0; i {
int j=i+1, m =i;
for(; j {
if(mysal[m].id > mysal[j].id)
{
m=j;
}
}
myswap(&mysal[m], &mysal[i]);
}
return mysal;
}
void print(salary* mysal, int num)
{
for(int i=0; i {
printf("name=%s \t id=%d \t depart=%s \t mOney=%d \n",
mysal[i].name, mysal[i].id, mysal[i].depart, mysal[i].money);
}
}
int main()
{
FILE* f;
salary mysal[MAXLINE];
char buf[1024];
char buffer[100][1024];
int i=0, j=0, m, n;
if( (f = fopen("testA.txt", "r")) == NULL)
{
printf("failed to open testA.txt");
}
memset(mysal, 0, MAXLINE*sizeof(salary));
while(fgets(buf, 1024, f))
{
sscanf(buf, "%s%d%s%d", mysal[i].name, &(mysal[i].id), mysal[i].depart, &(mysal[i].money));
if( strlen(mysal[i].depart) && mysal[i].id>0)
{
i++;
}
else
{
strcpy(buffer[j++], buf);
}
}
fclose(f);
paixu(mysal, i);
print(mysal, i);
if( (f=fopen("testB.txt", "w")) == NULL)
{
printf("failed to write testB.txt");
}
for(m=0; m {
fprintf(f, "%d\t%s", m+1, buffer[m]);
}
for(n=0; n {
fprintf(f, "%d\t%s\t%d\t\t%s\t\t%d\n", m+1,mysal[n].name, (mysal[n].id), mysal[n].depart, (mysal[n].money));
m++;
}
fclose(f);
system("type testA.txt");
system("type testB.txt");
return 0;
}
huangyang88(中国-必胜) ,麻烦你给出注释好吗?我刚开始做C,是菜鸟一只,看不懂啊。谢谢你了!
这个中用了结构体!!自定义了几个函数!!!!但是就是对于写函数和指针我一直用的都不怎么好!!我也的菜鸟!也希望能得到高手指导!!!!
我的邮箱是marry568509@tom.com
回复人: jialin0626(新月冰蓝)
原来你都已经工作了啊?我还以为你是学生呢?
你以前也开发过数据库?我的毕业设计就要做关于这方面的东西!
到时候向你请教喽!
to xczjl(雪村):
我是去年毕业的,然后就在一家公司做数据库开发(数据库是oracle),就做过一年,其实我也很菜的。不过,我愿意与你一起学习!
#include
#include
#include
typedef struct work {
char name[20];
int wnum;
int snum[5];
int money;
} worker;
worker people[100];
int n;
void sort()
{
int i, j, k;
worker t;
for (i = 0; i < n; i++) {
k = i;
for (j = i + 1; j < n; j++) {
if (people[k].wnum > people[j].wnum)
k = j;
}
if (k != i) {
t.wnum = people[i].wnum;
people[i].wnum = people[k].wnum;
people[k].wnum = t.wnum;
t.money = people[i].money;
people[i].money = people[k].money;
people[k].money = t.money;
strcpy(t.snum, people[i].snum);
strcpy(people[i].snum, people[k].snum);
strcpy(people[k].snum, t.snum);
strcpy(t.name, people[i].name);
strcpy(people[i].name, people[k].name);
strcpy(people[k].name, t.name);
}
}
}
main()
{
FILE * ifp;
FILE * ofp;
int i;
if ((ifp = fopen("textA.txt", "r")) == NULL) {
printf("Error!\n");
exit(1);
}
if ((ofp = fopen("textB.txt", "w")) == NULL) {
printf("Error!\n");
exit(1);
}
for (n = 0; !feof(ifp); n++)
fscanf(ifp, "%s %d %s %d", people[n].name, &people[n].wnum, people[n].snum, &people[n].money);
sort();
for (i = 0; i < n; i++)
fprintf(ofp, "%s %d %s %d\n", people[i].name, people[i].wnum, people[i].snum, people[i].money);
fclose(ifp);
fclose(ofp);
}
这里我用了效率比较低的方法。不过比较好理解。就是读出文件textA.txt里的所有记录,比较后再输出。
也可以用指针,比较好的方法。读文件时为了简单,textA.txt里的内容是:
张三 1001 001 2500
李四 1002 001 3000
王五 1008 002 2500
赵六 1005 003 4000
李七 1006 002 3500
钱八 1003 002 3500
孙九 1007 003 4500
输出时也没怎么弄格式。那个路径可能要改一下。看一下C的书就没问题的。
下面是用了指针的用法。而且都是按楼主要求的。
思路和上一个差不多,把数据都读出来。只是这次用了指针,然后排序后输到新方件里。
#include
#include
#include
typedef struct work {
char name[20];
int wnum;
int snum[5];
int money;
struct work * next;
} worker;
int n;
worker * head;
worker * sort(worker * h, int n)
{
int i, j;
worker * p, * q;
for (i = 0; i < n; i++) {
for (p = h->next, q = h, j = i + 1; j < n; j++) {
if (p->wnum > p->next->wnum) {
q->next = p->next;
q = p->next;
p->next = q->next;
q->next = p;
continue;
}
p = p->next;
q = q->next;
}
}
return h;
}
main()
{
FILE * ifp;
FILE * ofp;
char str[5][80];
worker * p, * q;
int i;
if ((ifp = fopen("textA.txt", "r")) == NULL) {
printf("Error!\n");
exit(1);
}
if ((ofp = fopen("textB.txt", "w")) == NULL) {
printf("Error!\n");
exit(1);
}
head = (worker *)malloc(sizeof(worker));
q = (worker *)malloc(sizeof(worker));
head->next = q;
for (i = 0; i < 5; i++)
fscanf(ifp, " %s" , str[i]);
for (n = 0; !feof(ifp); n++) {
p = q;
fscanf(ifp, "%s %d %s %d", p->name, &p->wnum, p->snum, &p->money);
q = (worker *)malloc(sizeof(worker));
p->next = q;
}
p->next = NULL;
head = sort(head, n);
i = 1;
fprintf(ofp, "%d %30s\n", i++, str[0]);
fprintf(ofp, "%d %10s%10s%15s%30s\n", i++, str[1], str[2], str[3], str[4]);
for (p = head->next; p->next; p = p->next)
fprintf(ofp, "%d %10s%10d%15s%28d\n", i++, p->name, p->wnum, p->snum, p->money);
fclose(ifp);
fclose(ofp);
}
textA.txt的内容是:
员工工资表
姓名 工号 部门编号 工资(单位:元)
张三 1001 001 2500
李四 1002 001 3000
王五 1008 002 2500
赵六 1005 003 4000
李七 1006 002 3500
钱八 1003 002 3500
孙九 1007 003 4500
啊!!!学到我前面去了,我要超过去,不能败给—>girl!
这个一些大虾也要负责,见是MM发的贴,全身都来劲了,没分照样拼命解决,实在是郁闷啊!
To Asan13(阿才) :谢谢你!不过希望你能给我注释。
To coyprightbao(菜鸟帽子):看不起女生呀???!!科学表明女生智商比男生高,但情商比男生低,所以女生容易被情所困,耽误事业。如果女生拼起事业来,男生是比不了的!(男同胞别打我呀) :P
#include
#include
#include
typedef struct work {
char name[20]; /*用一个结构来存放那些记录*/
int wnum;
int snum[5];
int money;
struct work * next;
} worker;
int n;
worker * head;
worker * sort(worker * h, int n) /*传递一个头指针,和记录的个数*/
{
int i, j;
worker * p, * q;
/*下面用了冒泡对记录排序*/
/*修改指针指向*/
for (i = 0; i < n; i++) {
for (p = h->next, q = h, j = i + 1; j < n; j++) {
if (p->wnum > p->next->wnum) {
q->next = p->next;
q = p->next;
p->next = q->next;
q->next = p;
continue;
}
p = p->next;
q = q->next;
}
}
return h; /*把头指针返回*/
}
main()
{
FILE * ifp;
FILE * ofp;
char str[5][80];
worker * p, * q;
int i;
if ((ifp = fopen("textA.txt", "r")) == NULL) {
printf("Error!\n");
exit(1);
}
if ((ofp = fopen("textB.txt", "w")) == NULL) {
printf("Error!\n");
exit(1);
}
head = (worker *)malloc(sizeof(worker));
q = (worker *)malloc(sizeof(worker));
/*建立一个头指针,这里和一般的头指针不一样,一般的头指针是存放第一个节点的指针,我这里是用一个和存放记录的指针一样,用里面的next指向第一个节点。这样在操作时就不用考虑头指针*/
head->next = q;
for (i = 0; i < 5; i++)
fscanf(ifp, " %s" , str[i]);
/*读出前面那五个字符串,这里有点不好,但想不出比这更好一点的。*/
/*下面是读出记录,对于格式,还是找点书看一下吧。*/
for (n = 0; !feof(ifp); n++) {
p = q;
fscanf(ifp, "%s %d %s %d", p->name, &p->wnum, p->snum, &p->money);
q = (worker *)malloc(sizeof(worker));
p->next = q;
}
q->next = NULL;
head = sort(head, n);/*排序好了的头指针*/
i = 1;
fprintf(ofp, "%d %30s\n", i++, str[0]);
fprintf(ofp, "%d %10s%10s%15s%30s\n", i++, str[1], str[2], str[3], str[4]);/*输出那个“姓名”。。。*/
/*下面是把排好的记录存到textB.txt里面,这里p=head->next而不是p=head就是上面所说的,为了操作方便,用head->next存放头指针。*/
for (p = head->next; p->next; p = p->next)
fprintf(ofp, "%d %10s%10d%15s%28d\n", i++, p->name, p->wnum, p->snum, p->money);
fclose(ifp);
fclose(ofp);
}
To Asan13(阿才) :谢谢你,大牛哥哥!!!:)
俺不专业一下,说句题外话……
现在搞IT的女生很难见到啊……
多谢几位大牛哥哥们的帮助,可是我又发现一个问题,我怎么结不了贴呀?!
真郁闷!!!
靠,这个是C语言中数据结构部分基本题目啊
具体是路是:
建立个结构体,然后从文件A中读取数据到内存中用插入链表的方法
进行排序后写入文件B
建议楼主多看看数据结构的书
我也是 搞数据库系统开发的
但是C语言真的很重要的