C语言替换文件某一行

C语言提供了文件操作,但是替换文件的某一行比较麻烦,下面是我使用的一个方法,文件中存贮的内容如下所示:

        11       1122          0       1122          *          *          0          0
        22        222          0        222          *          *          0          0
        33        333          0        333          *          *          0          0 
通过使用下面的几个函数,fopen,fprintf,fscanf,fseek,ftell 。具体的函数函数原型如下所示:
FILE*fopen(const char*filename,const char *mode);
int fprintf(FILE*stream,const char *format,...)
int fscanf(FILE* stream,const char *format,...)
int fseek(FILE*stream,long offset,int origin)
long ftell(FILE* stream)
首先,数据写入到文件中的是追加的形式。具体的写入代码如下所示:

主要写入时要指定每个数据的宽度,若不指定,当修改某行的数据,修改后的长度大于修改前得长度,将影响文件中的下一行。制定宽度之后,只要修改后的长度不大于制定的宽度,都不影响下面的内容。(这是注意点)

FILE *fp=fopen("clientinfo.txt","ar+");
Clientinfo info;
memset(&info,0,sizeof(Clientinfo));
。。。。
。。。。/*完成对info结构体的赋值*/
fprintf(fp,"%10s %10s %10d %10s %10s %10s %10d %10d",info.id,info.nickname,\
		info.online,info.pwd,info.encryp,info.ip,info.port,info.fd);
fprintf(fp,"\n");
fclose(fp);
修改处的代码如下所示,整个代码是我在MFC中实现的:

FILE *fp=fopen("clientinfo.txt","r+");
Clientinfo info;
long nline=0,n;
memset(&info,0,sizeof(Clientinfo));
int oldline=0;/*记录匹配位置的前一行的偏移量*/
CString str;
while((n=fscanf(fp,"%s %s %d %s %s %s %d %d",info.id,info.nickname,\
		&info.online,info.pwd,info.encryp,info.ip,&info.port,&info.fd))!=EOF)
{	
      str.Format("%d",nline);
      MessageBox(str);
      if(strncmp(info.id,id,id.GetLength())==0)/*查找要修改的位置*/
      {
	 oldline=nline;
	  break;
      }
      nline=ftell(fp);
}

fseek(fp,oldline,SEEK_SET);/*定位到要修改的位置,注意,这个位置是上一次读的最后,故写的时候要先写换行,第一行除外*/
    if(oldline!=0)
    {
     fprintf(fp,"\n");
    }
    fprintf(fp,"%10s %10s %10d %10s %10s %10s %10d %10d",info.id,info.nickname,\
        info.online,info.pwd,info.encryp,info.ip,info.port,info.fd);
    fprintf(fp,"\n");
    fclose(fp);
下面是修改后的数据,修改第二行,没有影响前后的数据。
        11       1122          0       1122          *          *          0          0
        22       222f          0       222f          *          *          0          0
        33        333          0        333          *          *          0          0


在C语言中,直接操作文件的每一行并删除特定并不直接支持,因为C语言本身并不提供这样的高级功能。通常,我们处理文本文件会涉及到读取、修改内容后写回,或者使用更专业的文本处理工具如sed、awk等外部命令。 如果你想在程序里实现这个功能,一种间接的方式是先读取整个文件到内存,然后遍历字符串数组(假设每是一个字符串),找到目标,将其从数组中移除,最后将剩余的写回到新的文件。但是这种方法对于大文件可能会导致内存不足的问题。 以下是简单的示例,用于演示如何逐读取并替换文件(而不是删除): ```c #include <stdio.h> #include <stdlib.h> #define MAX_LINES 100 // 假设最多只有这么多 int main() { char line[MAX_LINES][100]; // 每最多100字符 int lines_read = 0; FILE* file = fopen("input.txt", "r"); if (file == NULL) { perror("Error opening file"); return 1; } while (fgets(line[lines_read], sizeof(line[lines_read]), file)) { // 读取一行 lines_read++; if (strcmp(line[lines_read - 1], "target_line")) { // 找到目标并跳过 continue; } else { // 对目标的操作,这里只是打印出来,实际删除可以忽略这一行 printf("%s\n", line[lines_read - 1]); } } fclose(file); if (lines_read > 0) { // 如果有内容,尝试写回 FILE* new_file = fopen("output.txt", "w"); for (int i = 0; i < lines_read - 1; i++) { // 写回所有非目标 fputs(line[i], new_file); } fclose(new_file); } return 0; } ``` 请注意,这个示例仅用于演示,并不适合在生产环境中删除文件,因为它不提供错误处理,并且在处理大量数据时效率不高。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值