LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 971|回复: 6

C中的文件插入问题

[复制链接]
发表于 2003-4-7 11:58:51 | 显示全部楼层 |阅读模式
想编程在文本文件中插入字符,要求
1。不影响原有文件
2。不使用中间文件实现

如:文本流"abc\ndef\n"
在每个回车符前插入一个*变为
"abc*\ndef*\n"

请指教,谢谢!
发表于 2003-4-8 03:35:59 | 显示全部楼层
不影响原有文件是什么意思,就是要创建一个新文件了?那不就太简单了么。
也许你的意思是对这个文件一边读一边写,结束以后这个文件自己就变成新的文件了吧?这样的话,,,你没插入一个'*'的时候,就要多使用一个内存单元暂时保存那个被覆盖掉的没有检查过的字符。'\n'越多,临时内存需要的也越多了。
100M 的文件,每行50个字符的话,需要2M的额外内存。
有没有聪明一点的方法?

要不,先扫描一次,计算出需要插入多少个'*',然后从后往前改写文件?
发表于 2003-4-8 03:37:54 | 显示全部楼层
文件很小的话,干脆全都读入内存,在写出去好了,嘻嘻。
发表于 2003-4-8 19:04:42 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>

int
main(void)
{
        char c;

        while((c = getchar()) != EOF){
                if(c == '\n')
                        putchar('*');
                putchar(c);
        }

        exit(0);
}
发表于 2003-4-8 23:20:49 | 显示全部楼层
libinary:
你的程序如果这样运行会怎么样?
$ libinary_prog < liujiang_file > liujiang_file
他要“不影响原来文件”,但是不要中间文件,就是不知道可不可以生成一个新文件。:)
$ libinary_prog < liujiang_file > liujiang_newfile
发表于 2003-4-9 15:08:47 | 显示全部楼层
如果那样运行原文件就什么也没有了。
其实我觉得用标准流比较符合UNIX的精神。想要让一个程序符合所有人、所有任务是不可能的,所以UNIX程序都是小程序,每个程序只做一件事,如果单个使用一个程序可能没什么用处,但是可以把几个程序组合起来形成一个真正有用的、适合当前任务的程序。我的写法可以用在命令行管道里,如果非要针对某个文件的话那这个程序就真没什么用了。
发表于 2003-4-10 00:58:24 | 显示全部楼层
这样的话,可以写一个 filter 程序,
  $ myfilter string1 string2
他把输入中所有的 “string1” 在输出的时候替换成 "string2"。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表