发布网友
共5个回答
热心网友
#include <stdio.h>
#include<string.h>
typedef struct
{
char a[20];
char b[20];
char c[20];
int d;
}node,*link;
static int len;
void insert()
{
FILE* fp;
int num;
fp=fopen("A.txt","w");
printf("输入记录个数:");
scanf("%d",&num);
len=num;
while(num)
{
link nlink=new node[sizeof(node)];
printf("input a string:");
scanf("%s",nlink->a);
printf("input b string:");
scanf("%s",nlink->b);
printf("input c:string:");
scanf("%s",nlink->c);
printf("input d:int:");
scanf("%d",&nlink->d);
getchar();
fwrite(nlink,sizeof(node),1,fp);
num--;
}
fclose(fp);
}
void show()
{
FILE* fp;
fp=fopen("A.txt","r");
link abc=new node[sizeof(node)];
fread(abc,sizeof(node),1,fp);
int num=len;
while(num)
{
printf("%s %s %s %d\n",abc->a,abc->b,abc->c,abc->d);
fread(abc,sizeof(node),1,fp);
num--;
}
fclose(fp);
}
void add()
{
FILE* fp;
int offset=0;
int flag=0;
int sum=0;
fp=fopen("A.txt","a+");
printf("输入添加记录:\n");
link nlink=new node[sizeof(node)];
printf("input a string:");
scanf("%s",nlink->a);
printf("input b string:");
scanf("%s",nlink->b);
printf("input c:string:");
scanf("%s",nlink->c);
printf("input d:int:");
scanf("%d",&nlink->d);
sum=nlink->d;
//getchar();
int num=len;
link abc=new node[sizeof(node)];
fread(abc,sizeof(node),1,fp);
while(num)
{
if (strcmp(nlink->a,abc->a)==0 && strcmp(nlink->b,abc->b)==0)
{
flag=1;
}
fread(abc,sizeof(node),1,fp);
num--;
}
if (flag==0)
{
len++;
fwrite(nlink,sizeof(node),1,fp);
}
else
{
fclose(fp);
fp=fopen("A.txt","w+");
num=len;
fread(abc,sizeof(node),1,fp);
while(num)
{
if (strcmp(nlink->a,abc->a)==0 && strcmp(nlink->b,abc->b)==0)
{
abc->d+=nlink->d;
fwrite(abc,sizeof(node),1,fp);
}
fread(abc,sizeof(node),1,fp);
num--;
}
}
fclose(fp);
}
void main()
{
insert();
show();
add();
show();
}
热心网友
#include "stdio.h"
#include <string.h>
int main(int argv,char *argc[]){
char a[3][10],b[3][10];
int x,y,f=0,n,t;
FILE *fp;
if((fp=fopen("A.txt","r+"))==NULL){
printf("Open the file failure,exit...\n");
return 0;
}
printf("Please enter the information to modify:\n");
scanf("%s%s%s%d",b[0],b[1],b[2],&y);
while(fscanf(fp,"%s%s%s%d",a[0],a[1],a[2],&x)==4){
if(!strcmp(a[0],b[0]) && !strcmp(a[1],b[1]) && !strcmp(a[2],b[2])){
for(n=0,t=x;t;t/=10,n++);
fseek(fp,-n,1);
fprintf(fp,"%d",x+y);
f=1;
break;
}
}
fclose(fp);
if(f==0)
printf("Didn't find relevant information...\n");
return 0;
}
运行样例:
文件之前内容和之后内容
注:办法不少,这是之一……
热心网友
如果说你知道应该更改哪一条记录的话,可以直接用fseek函数定位文件指针到那个位置,然后fscanf取该记录,将其加上15后再次fseek定位这个位置然后fprintf写到该位置即可。
至于对文件的读写到底是用fscanf fprintf还是fread fwrite取决于你这个文件最初的写入方式,假如你的文件开始用的是第一组写入的,那读的时候也要用第一次,而假如写入的时候是第二组,那读的时候也应该是第二组。一般来说ascii文件用fscanf fprintf来读写,二进制文件用fread fwrite来读写
再有,你可能不知道到底要改哪条记录,我看你描述的意思好像是说要通过比较看哪组相同再往上加,这样的话你不必用fseek了,直接把文件内容全读到内存中来,然后依次比较它它们的值看哪些相同再做修改,修改后再重新写到文件中去。追问哎?是说fprintf写入的必须用fscanf读么?无论写入方式是w还是wb?
热心网友
比如已有文件A,它由结构体数组写入。假设结构体数组为4项,前三项是char xxx[20],最后一项是int型。===》描述不清。
文件,是存放到硬盘中的一些 数据,是要专门的函数打开和关闭的。
数组,是存放到内存中的一些 数据。
如果仅仅是数组中的数字,循环比较找到位置后,进行增、删、改。
那么,也就是计算偏移、数组遍历之类,就能获得了。追问这个主要是强调送入文件的数据的结构。用的是fscanf写入的啊。
追答建议,做作业,还是自己看书(比如谭浩强的)或者看源代码,比较给力。
热心网友
可以用seek。 因为类型已只,可以计算偏移获得。
当然也可以读入所有的数据,然后进行遍历获得追问您最好能具体些。fseek不太会用。而且文件的打开方式具体用哪个?