首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

纯C,对文件修改解决方案

2012-03-04 
纯C,对文件修改有一个文件:name:Glenname:XXXXsex:malesex:femaleage:24age:23age:22后面是注释部分

纯C,对文件修改
有一个文件:  
name:Glen  
;name:XXXX  
sex:male  
;sex:female  
age:24  
;age:23  
;age:22  

;后面是注释部分  

希望能够使用fgets()读一行,然后进行修改,比如要修改age,首先打开文件,然后使用fgets()读,首先判断是否是;号开头,如果是,忽略读取下一行。如果不是,进行关键字比对,如果比对失败,读取下一行,如果成功就把‘:’右边的具体年龄值修改。
我想要一个能够执行的程序,谢谢

[解决办法]
把所有不带;号的行读到一个二维数组:
#include "stdio.h "
void main()
{
char row[50][100];
FILE *fp;
int i,j;
i=0;
if((fp=fopen( "c:\\test.txt ", "r "))==NULL)

printf( "can not open file ");

char c;
while((c=fgetc(fp))!=EOF)
{
j=0;
while(c!= '\n '&&c!= '; '&&c!=EOF)
{
row[i][j]=c ;
c=fgetc(fp);
j++;
}
if(c!= '; ')
{
row[i][j]=c;
j++;
row[i][j]= '\0 ';
i++;
}
else
while((c=fgetc(fp))!= '\n '&&c!=EOF) ;
}
fclose(fp);
for(int s=0;s <i;s++)
printf( "%s ",row[s]);
}
[解决办法]
抛砖引玉一下.....

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LEN sizeof(struct node)

struct node
{
char str[20];
struct node *next;
};

int main()
{
FILE *fp;
char str[20];
char name[20];
char sex[20];
char age[10];
struct node *p, *q;
struct node *head=(struct node*)malloc(LEN);
p = head;

if ((fp = fopen( "e:\\test.txt ", "r+ ")) == NULL)
{
printf( "can 't open the file\n ");
exit(1);
}
while ((fgets(str, 20, fp)) != NULL)
{
q = (struct node *)malloc(LEN);
sscanf(str, "%s ", q-> str);
if (str[0] == '; ')
{
q-> next = NULL;
p-> next = q;
p = q;
continue;
}
else
{
q-> next = NULL;
p-> next = q;
p = q;
if ( strncmp(q-> str, "name ", 4) == 0)
{
printf( "Please input new name: ");
scanf( "%s ", name);
strncpy(q-> str+5, name, strlen(name)+1);
}
if ( strncmp(q-> str, "sex ", 3) == 0)
{
printf( "Please input new sex: ");
scanf( "%s ", sex);
strncpy(q-> str+4, sex, strlen(name)+1);
}
if ( strncmp(q-> str, "age ", 3) == 0)
{
printf( "Please input new age: ");
scanf( "%s ", age);
strncpy(q-> str+4, age, strlen(name)+1);
}
}
}

fseek(fp, 0L, SEEK_SET);
p=head-> next;
while(p!=NULL)
{
fprintf(fp, "%s\n ", p-> str);
p=p-> next;
}
fclose(fp);

return 0;
}



[解决办法]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
char key[_MAX_PATH]={0};
char value[_MAX_PATH]={0};
char filename[_MAX_PATH]={0};
char line[_MAX_PATH] ={0};
char key_old[_MAX_PATH]={0};


char value_old[_MAX_PATH]={0};

char sDel[]= ":\n ";
char* token = NULL;

fpos_t pos;

printf( "Input the file: ");
scanf( "%s ", filename);
printf( "\nSeach Key:\t\t ");
scanf( "%s ", key);
printf( "\nNew Key Value:\t\t ");
scanf( "%s ", value);

FILE* fp = fopen(filename, "r+ ");
if (fp==NULL) {
printf( "Can 't found the file: %s ", filename);
exit(0);
}

while (!feof(fp)) {
fgetpos(fp, &pos);
fgets(line, _MAX_PATH, fp);
if(line[0]== '; ') continue;

token = strtok(line, sDel);
if (token) strcpy(key_old, token);
token = strtok(NULL, sDel);
if (token) strcpy(value_old, token);

if (!strcmp(key, key_old)) {
//change the value;
fsetpos(fp, &pos);
while(strlen(value) <strlen(value_old)) {
strcat(value, " ");
}
fprintf(fp, "%s:%s ", key, value);
break;
}
}
fclose(fp);

system( "pause ");
return 0;
}
[解决办法]
看了一下上班几位大哥的代码,觉大大家都有个方面没考虑到:如果修改的值比原理的值的长度大该怎么处理?
按ls几位的写法,有可能和下一行和成一行或者覆盖下一行的数据.当然bargio_susie(平和 自制 审慎) 用链表实现
没问题.
当然,这样的问题我也一直是采取,使用临时文件的苯方法

[解决办法]
如果覆盖是没有办法的,文件的写操作本来就是覆盖操作的,要不你就把文件后面的内容全部重新写过的。一般你自己不换行的话,一行写的数据还是很多的
[解决办法]
看了一下上班几位大哥的代码,觉大大家都有个方面没考虑到:如果修改的值比原理的值的长度大该怎么处理?
_______________________________________________________________
难道我的程序不能处理这个问题???

当然,这样的问题我也一直是采取,使用临时文件的苯方法
_______________________________________________________________
如果你想这样做,那再建立个新文件,写进去就行了...

如果你想在原文件上写,而又不想覆盖原来的数据,用if ((fp = fopen( "e:\\test.txt ", "a+ ")) == NULL)方式好了..

热点排行