请问C语言怎么写文件到指定行啊

liuyang1943 2009-06-11 11:21:36
比如我想向a.txt文件的第10行写入“hello”并覆盖之前第十行的内容,用C语言的话应该怎么做啊?哪位高人指点下,最好能给出相关代码
...全文
1112 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
lee673 2009-06-11
  • 打赏
  • 举报
回复
用fseek函数先置文件内部指针到指定位置,在写入就行了吧
goodname 2009-06-11
  • 打赏
  • 举报
回复
长度固定,直接写就行。
liuyang1943 2009-06-11
  • 打赏
  • 举报
回复
需要2个文本文件吗?如果在只有一个TXT文件的情况下能实现吗?我的每一行内容长度都是固定的。长度为4,请问能不增加其他文件的情况下实现只修改第10行内容吗?
机智的呆呆 2009-06-11
  • 打赏
  • 举报
回复
移动文件指针到指定的位置,然后写新的内容~~~~
ameyume 2009-06-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 forwrj 的回复:]
文本文件的换行是两个字符\r\n

如:
文件源文件为1.txt内容如下:
11111\r\n
22222\r\n
......\r\n
999999\r\n
ABCDEF\r\n
..........
操作如下:
1.创建文件2.txt
2.按字节读取文件1.txt并一个字节一个字节的写到2.txt中,直到读到了9次\r\n
3.接下来再读1.txt并读到\r\n为止(如果读不到\r\n说明第十行是最后一行),但这些的字节不要写到2.txt中,把"hello"写到2.txt中去就可以了
4.如果文件只有10行,到这…
[/Quote]
up
forwrj 2009-06-11
  • 打赏
  • 举报
回复
这相本来就只改第10行呀
allen1986 2009-06-11
  • 打赏
  • 举报
回复
文件操作,一般可以移动指针,指向你想要重写的地方。
long lseek(int handle, long offset, int fromwhere)
函数功能: 移动文件位置指针到指定位置 。
然后就是替换字符窜了。
具体怎么替换,可以象楼上说的保存后面的内容再重写,或着你能想到其他的更好的方法当然好了,
forwrj 2009-06-11
  • 打赏
  • 举报
回复
这时2.txt就是你所要的文件
代码就不写了,编程的最重要的是思想.
liuyang1943 2009-06-11
  • 打赏
  • 举报
回复
能不能只修改第10行的内容,其他行的内容不变呢
forwrj 2009-06-11
  • 打赏
  • 举报
回复
文本文件的换行是两个字符\r\n

如:
文件源文件为1.txt内容如下:
11111\r\n
22222\r\n
......\r\n
999999\r\n
ABCDEF\r\n
..........
操作如下:
1.创建文件2.txt
2.按字节读取文件1.txt并一个字节一个字节的写到2.txt中,直到读到了9次\r\n
3.接下来再读1.txt并读到\r\n为止(如果读不到\r\n说明第十行是最后一行),但这些的字节不要写到2.txt中,把"hello"写到2.txt中去就可以了
4.如果文件只有10行,到这结果,关闭文件
5.如果文件不止10行,把1.txt余下的内容读写到2.txt中去,关闭打开的文件.
goodname 2009-06-11
  • 打赏
  • 举报
回复
像这种问题一般都是从第10行开始重写以后所有的东西。

你找到第10行,然后保存下面的内容到内存中,如果是很大的文件的话。

然后写入新的第10行,然后将保存到内存的东西追加到后面。
liuyang1943 2009-06-11
  • 打赏
  • 举报
回复
看来是我的编译器出问题了,同样的程序,我用arm-linux-gcc编译就能通过,用gcc编译就会出现
/usr/bin/ld:error while loading shared libraries:libdl.so.2:ELF file OS ABI invalid的错误。郁闷
liuyang1943 2009-06-11
  • 打赏
  • 举报
回复
FILE *fp = open(argv[1], "rb+");
iseek(fp, 5*linenum, SEEK_SET);


我这样改了还是一样的错误啊。。。
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 liuyang1943 的回复:]
我编译都没过啊。。
他是在windiws下跑过了的,我在linux下就不行了,出现了上面的错误。。。。
[/Quote]
试下open跟lseek
ItchIt 2009-06-11
  • 打赏
  • 举报
回复
fseek(fp, 5*linenum, SEEK_SET); // 5表示每行为4位,另外一位为换行符
fwrite(argv[3], len(argv[3]),1, fp);

貌似write 不能seek的,seek对write不管用

文件是流,要写的话只有append或者全部覆盖

可以用一个临时文件,按行写,写到第九行的时候滤掉第十行,写入新数据,再继续写完原文件,然后重命名临时文件
(我新手,说错了不准骂我)
liuyang1943 2009-06-11
  • 打赏
  • 举报
回复
我编译都没过啊。。
他是在windiws下跑过了的,我在linux下就不行了,出现了上面的错误。。。。
  • 打赏
  • 举报
回复
你是linux环境吗?
换成opne跟lseek系列看看。
  • 打赏
  • 举报
回复
你的运行代码的入参。贴来看看。
wesleyluo 2009-06-11
  • 打赏
  • 举报
回复
楼上的你用什么编译器啊?
感觉没问题。
liuyang1943 2009-06-11
  • 打赏
  • 举报
回复
#include <string.h>
#include <stdio.h>

int main(int argc, char *argv)
{

char linebuf[10];
int linenum=0;
int stderr;

if (argc <4)
{
fprintf(stderr, "usage: %s <file> linenumber string \n", argv[0]);
return -1;
}

FILE *fp = fopen(argv[1], "rb+");
if(!fp)
{
fprintf(stderr, "cannot open %s\n", argv[1]);
return -1;
}

if(argv[2] < 0)
{
fprintf(stderr, "linenumber cann't be negative.");
return -1;
}
else
{
linenum = argv[2];
}


fseek(fp, 5*linenum, SEEK_SET); // 5表示每行为4位,另外一位为换行符
fwrite(argv[3], len(argv[3]),1, fp);
fclose(fp);

return 0;


}

hairetz兄,上面是朋友给的代码,我编译却出现libdl.so.2: ELF file OS ABI invalid的错误,为什么呢?
加载更多回复(3)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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