读书人

C语言操作txt文本文件的

发布时间: 2012-03-07 09:13:51 作者: rapoo

C语言操作txt文本文件的求助!
在批处理的采集器(PDA)里,当我采集了数据之后,数据保存到采集器(PDA)默认的文件夹下,

假设文件夹为test,数据保存在aaa.txt记事本中,保存的内容和格式如下

(其中aaa.txt文件中的格式为:产品编码,产品数量):

9qwe2324,23
42343442,2
03fdsff1,56
00234231,6
80sdff52,11
76876888,29

。。。。。//省略

23423442,78//aaa.txt文件的最后一行

可以从上面的数据看出,产品编码是任意的字母或者是数字串,

现在我要完成的任务就是:

1,当有数据串(aaa.txt中的产品编码)进入的时候,要判断此数据串(产品编码)在采集器里的aaa.txt文件中是否存在此数据串(产品编码),要是存在,就把此产品数量+1,如果没有此产品编码,就在aaa.txt文件的最后一行追加一行记录,例如:(24234234,1);

请问用C语言怎样实现?还有问题,只是想不起来...谢谢~



[解决办法]
把文件的内容读到一个链表里。
在链表里判断,然后再写进文件
[解决办法]
缓存起来,读到链表,或者搞个内存映射
遍历链表
如果有就不管,没有就以追加形式写一行到文件
[解决办法]
如果想快一点,就将文件内容全部读入内存,然后一直在内存中进行操作,最后全部处理完后写入文件。比较时取每个“,”前,\r\n和后的字符串和进入的数据串比较,相同的话“,”后\r\n\前的字符串对应的数字+1,不同在末尾追加(先strlen取得长度,定位指针,然后追加)。

[解决办法]
给一个例子:

假设在一个单链表中存在2个连续结点p、q(其中p为q的直接前驱),若我们需要在p、q之间插入一个新结点s,那么我们必须先为s分配空间并赋值,然后使p的链域存储s的地址,s的链域存储q的地址即可。(p->link=s;s->link=q),这样就完成了插入操作。

  下例是应用插入算法的一个例子:

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define N 10
typedef struct node
{
 char name[20];
 struct node *link;
}stud;

stud * creat(int n) /*建立单链表的函数*/
{
 stud *p,*h,*s;
 int i;
 if((h=(stud *)malloc(sizeof(stud)))==NULL)
 {
  printf( "不能分配内存空间! ");
  exit(0);
 }
 h->name[0]= '\0 ';
 h->link=NULL;
 p=h;
 for(i=0;i<n;i++)
 {
  if((s= (stud *) malloc(sizeof(stud)))==NULL)
  {
   printf( "不能分配内存空间! ");
   exit(0);
  }
  p->link=s;
  printf( "请输入第%d个人的姓名: ",i+1);
  scanf( "%s ",s->name);
  s->link=NULL;
  p=s;
 }
 return(h);
}

stud * search(stud *h,char *x) /*查找函数*/
{
 stud *p;
 char *y;
 p=h->link;
 while(p!=NULL)
 {
  y=p->name;
  if(strcmp(y,x)==0)
   return(p);
  else p=p->link;
 }
 if(p==NULL)
  printf( "没有查找到该数据! ");
}

void insert(stud *p) /*插入函数,在指针p后插入*/
{
 char stuname[20];
 stud *s; /*指针s是保存新结点地址的*/
 if((s= (stud *) malloc(sizeof(stud)))==NULL)
 {
  printf( "不能分配内存空间! ");
  exit(0);
 }
 printf( "请输入你要插入的人的姓名: ");
 scanf( "%s ",stuname);
 strcpy(s->name,stuname); /*把指针stuname所指向的数组元素拷贝给新结点的数据域*/
 s->link=p->link; /*把新结点的链域指向原来p结点的后继结点*/
 p->link=s; /*p结点的链域指向新结点*/
}

main()
{
 int number;
 char fullname[20]; /*保存输入的要查找的人的姓名*/
 stud *head,*searchpoint;
 number=N;
 head=creat(number); /*建立新链表并返回表头指针*/
 printf( "请输入你要查找的人的姓名: ");
 scanf( "%s ",fullname);
 searchpoint=search(head,fullname); /*查找并返回查找到的结点指针*/
 insert(searchpoint); /*调用插入函数*/
}
[解决办法]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct list
{
char id[20];
int count;
struct list *next;
};

int main()
{
char str[20];
char ptr[10];
struct list *head, *p, *q;
FILE *fp;
fp = fopen( "e:\\input.txt ", "r+ ");
if( fp == NULL )


printf( "can 't read %s\n ", "input.txt ");
head = (struct list *)malloc(sizeof(struct list));
head-> next = NULL;
p = head;
while( fgets(str, 20, fp) != NULL )
{
q = (struct list *)malloc(sizeof(struct list));
sscanf(str, "%8s,%d ", q-> id, &q-> count);
q-> next = NULL;
p-> next = q;
p = q;
}

printf( "Please input NO. of the product: ");
gets(ptr);
p = head-> next;
while ( p != NULL )
{
if ( strcmp(p-> id, ptr) == 0)
{
printf( "exist this product\n ");
p-> count++;
break;
}
p = p-> next;
}
if ( p == NULL )
{
printf( "not exist this product\n ");
p = head;
while( p-> next != NULL)
p = p-> next;
q = (struct list *)malloc(sizeof(struct list));
q-> next = NULL;
strcpy(q-> id, ptr);
q-> count = 1;
p-> next = q;
p = q;
}
p = head-> next;
fseek(fp, 0L, SEEK_SET);
while ( p != NULL )
{
fprintf(fp, "%s,%d\n ", p-> id, p-> count);
p = p-> next;
}
fclose(fp);

return 0;
}


[解决办法]
你这个方案实现效率是不高的,你的实现其实是一个数据库操作,不过存储数据的文件格式不是专有格式,而是txt类型而已。
实现的操作主要有
在txt数据库中搜索
更改txt数据库中某项的值
添加新记录

其实你应该找一个小型高效的轻量数据库来做这样的事,而且最后有索引(对产品编号索引)
----
要在直接文件操作中实现比较困难的地方是更新一个项中的值,因为你要改写txt的部分并不是直接改写,而是复制前面不需要改写部分,写入改写部分,再复制后续部分,如果你的数据库数据量比较大(txt文件比较大)你说有多麻烦,所以楼上有人提出了链表,其实就是解决txt文件编辑的工作。
[解决办法]
考虑到PDA性能的低下,如果没有实际需要,还不如把结果拿到计算机上处理,而PDA上就记录条目了,也就是那个TXT转化成单列的,每次采集就在文件末尾增加一个产品编号,因为是一直增加,这样的文件操作要简单很多。
[解决办法]
只有两列,为什么要用txt文件呢?用WritePrivateProfileString()操作ini文件是否更好一些~~
[解决办法]
昨天回复的时候没看清 如果是用vxworks 或者 ucos 或者其他的, 那么他们自带的库比较少.
另外这种设备存储空间有限, 如果数据量大, 在内存中维护列表是很不合适的
不过看情况匹配产品编码是用到的编码列表应该要保存在内存中, 在看看是否有条件排一下续,检索是快一点.

或者还有就是先不检索,只记录,最后(或者在某一个时机)才统计.

读书人网 >C语言

热点推荐