免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4120 | 回复: 4
打印 上一主题 下一主题

大侠:c语言修改文件出错,求解! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-10 22:02 |显示全部楼层 |倒序浏览
20可用积分
求大侠告诉我该怎么改!!!

1.程序思路:
    先从文本文件test中读出内容,放到char tmp[200]中;
    读的过程,遇到“name=apple”时,不将它放入tmp[200]中,而是换成“name=banana”;
    最后再将tmp[200]的内容写入文本文件test.


2.文本文件test中的内容:
sort=fruits;
name=apple
price=4


3.程序:(程序代码见下,运行在linux下)
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define txtfile "test"
int main()
{
        FILE *fp, *fp2; char tmp[200];char *line; size_t len; int ret;

        //read content form txtfile;
        fp=fopen(txtfile,"r");
        if(fp == NULL){perror(txtfile);exit(EXIT_FAILURE);}
        while ((read = getline(&line, &len, fp)) != -1) {
                if(line=="\n")continue;
                if(strstr(line,"name=apple"))
                        strcat(tmp,"name=banana");
                else
                        strcat(tmp,line);
                strcat(tmp,"\n");
        }
        fclose(fp);

        //write content from tmp back to txtfile;
        fp2 = fopen(txtfile, "w");
        if(fp == NULL){perror(txtfile);exit(EXIT_FAILURE);}
        ret=fputs(tmp,fp);
        if(ret <0||ret==EOF)
                printf("Write error!\n");
        fclose(fp2);

        return 0;
}


4.执行时出现错误:
[apples@dnisw3 test]$ ./a.out
*** glibc detected *** ./a.out: realloc(): invalid pointer: 0x008acfc0 ***
======= Backtrace: =========
/lib/i686/nosegneg/libc.so.6(realloc+0x3ab)[0x91e84b]
/lib/i686/nosegneg/libc.so.6[0x91e991]
/lib/i686/nosegneg/libc.so.6(realloc+0x3c)[0x91e4dc]
/lib/i686/nosegneg/libc.so.6(getdelim+0x16a)[0x90b4ca]
/lib/i686/nosegneg/libc.so.6(getline+0x33)[0x9088c3]
./a.out[0x80485ef]
/lib/i686/nosegneg/libc.so.6(__libc_start_main+0xdc)[0x8c9f2c]
./a.out[0x8048461]
======= Memory map: ========
00893000-008ac000 r-xp 00000000 08:01 7997060    /lib/ld-2.5.so
008ac000-008ad000 r--p 00018000 08:01 7997060    /lib/ld-2.5.so
008ad000-008ae000 rw-p 00019000 08:01 7997060    /lib/ld-2.5.so
008b4000-009ef000 r-xp 00000000 08:01 7997061    /lib/i686/nosegneg/libc-2.5.so
009ef000-009f1000 r--p 0013a000 08:01 7997061    /lib/i686/nosegneg/libc-2.5.so
009f1000-009f2000 rw-p 0013c000 08:01 7997061    /lib/i686/nosegneg/libc-2.5.so
009f2000-009f5000 rw-p 009f2000 00:00 0
00a98000-00a99000 r-xp 00a98000 00:00 0          [vdso]
00c9e000-00ca9000 r-xp 00000000 08:01 7997070    /lib/libgcc_s-4.1.1-20061011.so.1
00ca9000-00caa000 rw-p 0000a000 08:01 7997070    /lib/libgcc_s-4.1.1-20061011.so.1
08048000-08049000 r-xp 00000000 08:03 24414215  /home/apples/test/a.out
08049000-0804a000 rw-p 00000000 08:03 24414215  /home/apples/test/a.out
0903c000-0905d000 rw-p 0903c000 00:00 0
b7ef1000-b7ef2000 rw-p b7ef1000 00:00 0
b7f0d000-b7f0f000 rw-p b7f0d000 00:00 0
bfd49000-bfd5f000 rw-p bfd49000 00:00 0          [stack]
Aborted

论坛徽章:
0
2 [报告]
发表于 2009-01-11 13:15 |显示全部楼层
原帖由 ilex 于 2009-1-10 22:24 发表
另外
局部变量未初始化,比如tmp[200]。


看程序的要求,以及代码的风格,估计楼主还是学生吧;

嗯,一点小建议,代码写完了,不用立即就编译,立即就运行,先看看代码是不是有明显的BUG;


谢谢你啊。。是小弟传帖子时为了简单就直接把靠前的代码copy了过来。。。。
让大侠失望了,小弟刚毕业半年,c确实学的不好,正在狂补。。。
最后,再次真诚的感谢,还望仁兄们多多指教啊。。。有什么问题麻烦赶紧告给我指明。。。

论坛徽章:
0
3 [报告]
发表于 2009-01-11 13:18 |显示全部楼层

问题解决了,多谢各位。

各位说的很正确,再次感谢啊!!!

现将运行正确的代码贴出来:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define txtfile "test"
#define buff_len 200
#define line_len 64

int main()
{
        FILE *fp, *fp2;
        char tmp[buff_len]={0};
        char *line=(char *)malloc(line_len);
        size_t len;
        ssize_t read;
        int ret;
        //read content form txtfile;
        fp=fopen(txtfile,"r");
        if (fp == NULL){
                perror(txtfile);
                exit(EXIT_FAILURE);
        }
        while ((read = getline(&line, &len, fp)) != -1) {
                if(strstr(line,"apple")){
                        strcat(tmp,"name=banana");
                        strcat(tmp,"\n");
                }
                else
                        strcat(tmp,line);
        }
        fclose(fp);
        //write content from tmp back to txtfile;
        fp2 = fopen(txtfile, "w");
        if (fp2 == NULL){
                perror(txtfile);
                exit(EXIT_FAILURE);
        }
        ret=fputs(tmp,fp2);
        if(ret<0||ret==EOF)
                printf("Write error!\n");
        fclose(fp2);

        return 0;
}

怎么改进???

各位:
       这个程序里有几个问题,第一,程序中两次打开同一文件,能否只打开一次,该怎么写?
第二,getline函数是<string.h>里的,纯c里面是不是没这个函数啊,怎么替换掉它呢?
第三,程序写的很笨,有高手能写得更简洁高效么?
当然,可能还有其他小弟没发现的问题,请各位指出来!!!

最后,重申本程序的目的:c语言修改一个文本文件中的一段字符串。期待!!!

[ 本帖最后由 apple_7095 于 2009-1-11 13:27 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-01-11 13:25 |显示全部楼层

怎么改进???

各位:
       这个程序里有几个问题,第一,程序中两次打开同一文件,能否只打开一次,该怎么写?
第二,getline函数是<string.h>里的,纯c里面是不是没这个函数啊,怎么替换掉它呢?
第三,程序写的很笨,有高手能写得更简洁高效么?
当然,可能还有其他小弟没发现的问题,请各位指出来!!!

最后,重申本程序的目的:c语言修改一个文本文件中的一段字符串。期待!!!

论坛徽章:
0
5 [报告]
发表于 2009-01-12 21:26 |显示全部楼层

参考链接

关于本问题,我也在其他地方有提问,现列出来,以供需要的朋友参考:

http://topic.csdn.net/u/20090110 ... html?seed=927584263
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP