C语言 文件读写

能来个人详细介绍下涉及文件读写的函数(fseek/fprintf/fscanf/fputs/fputc/...)
不过请优先解决这样的问题
比如已有文件A,它由结构体数组写入。假设结构体数组为4项,前三项是char xxx[20],最后一项是int型。
假设文件A有如下数据(示意而已,先忽略定义的20):
001 bbb ccc 123
002 ccc ddd 321
想实现输入一个数字将它加到文件中任何一组数据的整型数字部分。请问使用什么函数?请留下简单代码。
请您尽量不要使用fprintf。因为我这作业中实际的功能比较复杂。
实际功能类似于A文件中有若干组数据。从键盘输入同格式的数据。假如前两项相同:
比如输入001 bbb xxx 15,那么第三项无视,第四项中的15加到拥有同样前两项的数据的整型数字部分、在这里也就是给123加上15.
因为需要一个循环比较,之前首先用fscanf取出A的数据,然后又要比较,如果用printf写回去感觉逻辑上有些复杂,很容易把数据盖掉。当然如果您有办法解决也可以使用fprintf,但请您留下具体代码。非常感谢~

#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(); 

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-01-05
#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; 
}

运行样例:

文件之前内容和之后内容

注:办法不少,这是之一……

第2个回答  2012-08-18
如果说你知道应该更改哪一条记录的话,可以直接用fseek函数定位文件指针到那个位置,然后fscanf取该记录,将其加上15后再次fseek定位这个位置然后fprintf写到该位置即可。
至于对文件的读写到底是用fscanf fprintf还是fread fwrite取决于你这个文件最初的写入方式,假如你的文件开始用的是第一组写入的,那读的时候也要用第一次,而假如写入的时候是第二组,那读的时候也应该是第二组。一般来说ascii文件用fscanf fprintf来读写,二进制文件用fread fwrite来读写
再有,你可能不知道到底要改哪条记录,我看你描述的意思好像是说要通过比较看哪组相同再往上加,这样的话你不必用fseek了,直接把文件内容全读到内存中来,然后依次比较它它们的值看哪些相同再做修改,修改后再重新写到文件中去。追问

哎?是说fprintf写入的必须用fscanf读么?无论写入方式是w还是wb?

第3个回答  2012-08-18
比如已有文件A,它由结构体数组写入。假设结构体数组为4项,前三项是char xxx[20],最后一项是int型。===》描述不清。
文件,是存放到硬盘中的一些 数据,是要专门的函数打开和关闭的。
数组,是存放到内存中的一些 数据。
如果仅仅是数组中的数字,循环比较找到位置后,进行增、删、改。
那么,也就是计算偏移、数组遍历之类,就能获得了。追问

这个主要是强调送入文件的数据的结构。用的是fscanf写入的啊。

追答

建议,做作业,还是自己看书(比如谭浩强的)或者看源代码,比较给力。

本回答被网友采纳
第4个回答  2012-08-18
可以用seek。 因为类型已只,可以计算偏移获得。
当然也可以读入所有的数据,然后进行遍历获得追问

您最好能具体些。fseek不太会用。而且文件的打开方式具体用哪个?

相似回答