C编程, 删掉一个普通文本内的指定的一行,怎么做才行?

AKara 2002-11-03 03:55:32
C编程, 删掉一个普通文本内的指定的一行,怎么做才行?
...全文
128 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
li_zuo_min 2002-12-01
  • 打赏
  • 举报
回复
我觉得不移动内容,只有用空格代替当前要删除行的字母.

程序比较简单.
beijita 2002-11-30
  • 打赏
  • 举报
回复
用字符串可以,不过有些麻烦
goodname 2002-11-29
  • 打赏
  • 举报
回复
mark
rockhard 2002-11-27
  • 打赏
  • 举报
回复
// 有些文本文件的行结尾不是0xd0xa,而只有0xa,到现在我还不明白为什么
与你打开文件的方式有关,文本方式与二进制方式的差别。
xiaoandkang 2002-11-25
  • 打赏
  • 举报
回复
指定一行?
打开一个输入流一个输出流
把这行以前的读入输出流,空一行,再把剩下的全部导入输出流



踏岸寻柳 2002-11-21
  • 打赏
  • 举报
回复
记得sed吗?可以轻易、快速的得到这个结果。

不过对于C来说,atom113的说法我觉得有可行性。
RainWindy 2002-11-21
  • 打赏
  • 举报
回复
忘了补充几句,由于时间关系,我没有编译测试,请大家帮帮忙,可能其中还有一些小错误,但总体上是这样写的。如果谁还有更好的方法,不吝赐教.
RainWindy 2002-11-21
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <io.h>
// 假设删除第一个包含字符串"请多指教"的行
// 并假设文件不大,否则需要分批读取
void main()
{
char* filename="temp";
char* cmpstr="请多指教";

FILE* in=fopen(filename, "rb+"); // 上面写错了
if(in==NULL)
{
printf("open file %s error!\n", filename);
return;
}

long length = filelength(fileno(in));
char*buff =(char*)calloc(length+1,0);
// 可以初始化为0,如果使用malloc,则还需使用memset(buff, 0, length+1),
// +1的目的是将buff当作字符串,以'\0'结尾
if(buff==NULL)
{
printf("malloc error!size:%ld\n",length);
fclose(in);
return;
}

fread(buff, length, 1, in);

char*ptr=strstr(buff, cmpstr);
if(ptr==NULL)
{
printf("Not Found the String:%s\n", cmpstr);
fclose(in);
free(buff);
return;
}
*ptr=0; // 起始位置
ptr++;

char*ptr2=strrchr(buff, 0xa); // 查找上一个回车键
// 有些文本文件的行结尾不是0xd0xa,而只有0xa,到现在我还不明白为什么

long pos;
if(ptr2==NULL) // 如果没有找到,则表明是处于第一行
pos=0;
else // 否则起始位置是下一个字符。
pos = ptr2-buff+1;

long len; // 被删除行的长度
char*ptr3=strchr(ptr, 0xa); // 查找需要删除的结尾

if(ptr3==NULL) // 如果没有找到,则表明是文件尾
len = length - pos;
else // 如果找到
len = ptr3-ptr2;

ptr3++;
if(*ptr3) // 不是位于文件尾
{
fseek(in, pos, SEEK_SET);
fwrite(ptr3, length-pos-length, in);
}
chsize(fileno(in), length-len);
free(buff);
fclose(in);
}
RainWindy 2002-11-21
  • 打赏
  • 举报
回复
假设文件的长度为length(用二进制方式打开fread(filename,"rb"),首先查找需要删除的行strstr(...),计算需要删除的字符数len(注意包含\xd及\xa),获得删除的第一个字符的位置pos,从位置pos+len开始读取length-(pos+len)个字符,并将这些字符写到从pos开始的位置,最后将文件的长度设置为(length-len)(chsize(length-len))。
采用以上办法,最好的情况是需要删除的字符位于文件末尾,则只需要执行chsize函数,最差的情况就是位于文件头,则首先要将后面的数据写到文件形状,再设置文件的长度。所以效率是:移动(length-len)/2个字符+chsize(length-len).
jyc_nj 2002-11-05
  • 打赏
  • 举报
回复
文件是按簇存放的,即是顺序空间,所以,对要删除一行,方法应该是把后面的内容拷上来覆盖掉要删的内容,很象memmove.
atom113 2002-11-05
  • 打赏
  • 举报
回复
将文件读入一块内存中,再进行处理,最后写回,这样做比较好
nanxue_jiang 2002-11-05
  • 打赏
  • 举报
回复
请有经验的人事解答!答案要肯定,这样才有效率!
niaosuy 2002-11-04
  • 打赏
  • 举报
回复
如果只想删除一行而不移动其他的行,据我所知,不可能,除非是文件的最后一行.
step_by_step 2002-11-04
  • 打赏
  • 举报
回复
不行
ilovecs 2002-11-03
  • 打赏
  • 举报
回复
定义一个计数器,然后读入文本(fgetc),遇到'\n'计数器加1,当n==指定行时,开始删除到下一个'\n'。应该可以。
AKara 2002-11-03
  • 打赏
  • 举报
回复
thanX~~~
Laney 2002-11-03
  • 打赏
  • 举报
回复
帮你顶
AKara 2002-11-03
  • 打赏
  • 举报
回复
如果更苛刻一点, 要删一个字母的话, 为删掉它就要全文件动用COPY的话,
不太好喔, 呵呵.
AKara 2002-11-03
  • 打赏
  • 举报
回复
岂不是很没有效率? 呵呵.
有没有方法直接覆盖想要删的那一行为空.?

YYBear 2002-11-03
  • 打赏
  • 举报
回复
最土的方法:

准备一个临时文件,将源文件的内容,一行一行地复制到临时文件中,遇到该删除的行时,跳过,最后将源文件删掉,再把临时文件改名成源文件
用于windows下面的vim编辑器。 给喜欢vim的人使用。详细如下: 好吧,详细点,这里写出一些基本的命令: 【什么是vi】 vi就是linux命令行下的最著名的编辑器之一,(编辑器就是类似windows记事本的功能,不过vi功能比记事本强大无限倍!^_^),现在实际使用的都是vim,它是vi的改进版本,所以现在的vi基本上就是vim了。 【vi能做什么】 第一个功能不用多说,vi可以编辑文本文件。至于其他的功能,多得无法列举,我只说我所知的一些典型的功能应用: (1)编辑文本文件 (2)方便地阅读程序源代码 (3)当文件目录浏览器来用 (4)提供编程、调试环境 (5)利用vi执行一些脚本文件(vi有自己的脚本文件语法) (x)等等等等...... 【vi的操作模式】   vi具有两种基本模式,为输入模式(或插入模式、编辑模式)和指令模式(或命令模式)。输入模式下输入字符,文本就会显示在屏幕上;而指令模式下输入字符就解释为一个输入命令并执行,而不会显示相应的字符。理解指令模式最简单方式就是想象平时剪切、复制以及粘贴数据时所发生的情况。 使用[Esc]键可以停止当前操作(插入或者命令)重新回到指令模式,准备接受新的指令。如果本来就在指令模式下面,将会响铃一下。 【最基本的使用】 这里提供了使用vi得最基本的操作,能够实现大多数的编辑目的。如果你肯花几分钟把“最基本的使用”的内容都实践一下,那么你至少可以独立地在vim中朝你想要得方向“前进”了。如果你不想学习,那么就把它当作一个“字典”吧。 *用vi打开一个文件: 输入“vi filename”. 这里,filename就是你要打开的文件的名字,默认打开文件后vi处于指令模式。 *进入编辑模式编辑打开的文件: 输入“i”. 或输入“a”. 进入编辑模式后,你可以直接敲入想要输入的字符到文件,两者的区别是i在当前字符前面开始插入,a在当前字符后面开始插入。 *退出编辑模式: 输入“[Esc]”. 这样,将返回指令模式,准备接收你要传达给vi的指令并执行,如果之前已经在指令模式下,那么系统将响铃提醒一下。 **以下命令都是在命令模式下进行: *撤销修改: 输入“u”. 这里,相比以前的vi来说,vim支持多步撤销。 *恢复修改: 输入“[Ctrl]r”. 这里,和撤销命令相反,是撤销的撤销,也可多步。 *复制行到剪切板: 输入“yy”. *复制选定内容到剪切板: (1)输入“v”。 (2)按方向键将高亮选择的内容。 (3)输入“y”。 这里,开始输入v使vi临时进入了一个"选择模式",输入方向键可以选择,输入y将选择的内容复制剪切板。 *删除行: 输入“dd”. 注意,vi的删除等价于剪切,删除的内容会保存到剪切板中。 *删除选定内容: (1)输入“v”。 (2)按方向键将高亮选择的内容。 (3)输入“d”。 这里,开始输入v使vi临时进入了一个“选择模式”,输入方向键可以选择,输入d将选择的内容删除。 *粘贴: 输入“p”. 这样会将剪切板的内容粘贴到光标位置或者光标下一行。 *查找字符并定位到第一个匹配处: 输入“/character”. 这里character是待查找的字符,只要先输入/,再输入待查字符,最后回车即可定位到第一个匹配的字符处。 *定位到匹配查找的下一个字符处: 输入“n”. *定位到匹配查找的上一个字符处: 输入“N”. *保存文件: 输入“:w”. 注意w前面的':',输入':'之后,vim会将':'之后的输入解释为待执行的指令。 *退出: 输入“:q”. 这里,如果文件没有保存,将提示无法退出,除非你强制退出,不保存文件,或者保存退出。 *强制退出: 输入“:q!”. *保存退出: 输入“:wq”. 或输入“ZZ”. *察看帮助 输入":help". ** 另外还有一个简易的教程: 输入命令:vimtutor.

24,856

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧