免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2078 | 回复: 8

[C] 一个文件操作的问题 [复制链接]

论坛徽章:
0
发表于 2008-11-19 22:59 |显示全部楼层
10可用积分
写这个程序的本来目的就是我有一个文件,很多行代码
但是从一个书里copy过来的,里面的代码都是这样的
1 #include<>
2 ...
3 ...

等,意思是每行都有行号和一个空格
我想把他删除掉,懒的手动删,就花几分钟写了几行代码,开始以为很简单
但最后发现个小问题

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXLINE 1024
int main()
{
        int i;
        char s[MAXLINE];
        char *p = s;
        FILE *fp, *fp1;
        fp = fopen("a.c", "r+" );
        fp1 = fopen("a.c", "r+" );

        while((p = fgets(s, MAXLINE, fp)) != NULL){
                i = 0;
                while((isdigit(p) || isspace(p)) && i<3){
                        strcpy(p + i, p + i +1);
                }
                fputs(p, fp1);
        }
        return 0;
}


假设有我一个a.c的文件
里面的你内容是这样的:
1 ab
2 cd
3 ef
4 gh
5 ij
6 kl
7 mn
8 pq
9 rs
10 tu
11 vw
12 xy
13 za
14 bc
15 de
16 fg


运行程序后就是这样的,怎么回事儿捏???
ab
cd
ef
gh
ij
kl
mn
pq
rs
tu
vw
xy
za
bc
de
fg
tu
11 vw
12 xy
13 za
14 bc
15 de
16 fg



想不清楚!貌似原文件的行数越多,最后尾随的那部分越多!

论坛徽章:
0
发表于 2008-11-19 23:01 |显示全部楼层
我如果把结果保存到其他文件中是完全正确的
就是试图代替原文件,就会产生这个结果

论坛徽章:
0
发表于 2008-11-19 23:08 |显示全部楼层
你对同一个文件一边读一边写当然不行。

为说明问题,用一个只有一行的文件 a.c,内容为 01 ab\n

现在文件中有6个字符,fgets 得到数组内容 01 ab\n\0,若干个 strcpy 处理后变为 ab\n\0... ,再写入,覆盖掉 01空格,得到 ab\nab\n

即:


  1. 01 ab\n 变为

  2. ab\nab\n
复制代码


那不就一行变两行了。你原来的内容没有删除掉,只在上面复写,是这样的啦。

[ 本帖最后由 win_hate 于 2008-11-19 23:45 编辑 ]

论坛徽章:
0
发表于 2008-11-19 23:10 |显示全部楼层
你的代码用 code 括一下把,是不是星号被 CU 征用了?


  1. isdigit(p)
复制代码

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
发表于 2008-11-20 00:32 |显示全部楼层
原帖由 Atrexl 于 2008-11-19 23:01 发表
我如果把结果保存到其他文件中是完全正确的
就是试图代替原文件,就会产生这个结果

fp1 = fopen("a.c", "r+" );
..
fputs(...)
会把去掉行号空格的内容从a.c的开始位置写入,覆盖原有文件内容。fp fp1分别使用两个不同的文件定位符。

“最后尾随的那部分越多。。”

剩余的内容是未被覆盖的,字节数等于已删除的行号加空格的字节数。
1)
剩余内容
tu\n
11 vw\n
12 xy\n
13 za\n
14 bc\n
15 de\n
16 fg\n
共计39个字节。
2)
删除掉的行号和空格
1空格2空格3 ... 16空格 也是39个字节

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
发表于 2008-11-20 12:32 |显示全部楼层

回复 #1 Atrexl 的帖子

因为读写都是同一个文件,原文件字节数大于新文件字节数,写完文件后,调用truncate或ftruncate将文件设置为新的大小(字节数)即可。建议不要对同一个文件同时进行读写操作,可以先写到临时文件,然后改名(rename)回来即可。

论坛徽章:
0
发表于 2008-11-20 12:40 |显示全部楼层
楼主重造轮子的勇气固然可嘉,我就不知道你为什么不用脚本?
cut -d: -f2- OriginalFile.c > destination.c

论坛徽章:
0
发表于 2008-11-20 15:22 |显示全部楼层
原帖由 wuqing 于 2008-11-20 12:40 发表
楼主重造轮子的勇气固然可嘉,我就不知道你为什么不用脚本?
cut -d: -f2- OriginalFile.c > destination.c

嗯。
读写同一个文件。
而且这段代码很……:
i = 0;
while((isdigit(p) || isspace(p)) && i<3){
    strcpy(p + i, p + i +1);
}
i < 3 forever。
在这里i是无用的
貌似楼主没想清楚怎么实现就写代码了。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
发表于 2008-11-20 15:35 |显示全部楼层
楼上好眼神
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP