纯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)方式好了..