QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1374|回复: 12

新手向大家请教文件读写

[复制链接]
发表于 2006-3-22 12:56:33 | 显示全部楼层 |阅读模式
`
   `
while (!feof(fp))
  {
    ch = fgetc(fp);
    ch = ch + 4;
    //fp = fp - sizeof(char);
    fputc(ch, fp);
  }
  `
  `

fopen()打开方式为"r+",我想从文件中读入一个字符,值加上4后存入文件,请问这样能实现吗?还是读和写要分别打开文件?谁能帮我写一段正确的代码阿?

并且我在ddd中调试的时候,fp的值为什么老是不变,不是说fetc,fputc能自动使文件指针往后移吗?
发表于 2006-3-22 14:56:44 | 显示全部楼层
调用fseek函数移动文件指针。
回复

使用道具 举报

发表于 2006-3-22 18:44:31 | 显示全部楼层
fp是句柄,不是文件指针。
回复

使用道具 举报

 楼主| 发表于 2006-3-22 20:14:08 | 显示全部楼层
while (!feof(fp))
    23   {
    24     ch = fgetc(fp);
    25     ch = ch + 4;
    26     fseek(fp, -1L, SEEK_CUR);
    27     fputc(ch, fp);
    28   }

好像不行啊,fseek总跳到文件开始的位置,我看不出来哪里有问题啊?
帮我看哈!为什么?
回复

使用道具 举报

发表于 2006-3-22 20:55:20 | 显示全部楼层
为什么读写均用一个文件呢?
回复

使用道具 举报

 楼主| 发表于 2006-3-22 21:14:36 | 显示全部楼层
我用"r+"打开的文件,想试试能不能同时进行读和写,

while (!feof(fp))
    23   {
    24     ch = fgetc(fp);
    25     ch = ch + 4;
    26     fp->_ptr -= 1;
    27     //fseek(fp, -1L, SEEK_CUR);
    28     fputc(ch, fp);

这两种方法都不行,读文本文件的前几个字符能行,可到几个后,fgetc(fp)就出现-1值了,不知道什么原因,你知道吗?
回复

使用道具 举报

发表于 2006-3-23 09:52:02 | 显示全部楼层
[code:1]
    while((ch=fgetc(fp)) != EOF)
    {
        fseek(fp,-1L,SEEK_CUR);
        fputc(ch+4,fp);
    }

[/code:1]
你那样作feof(fp)永远都返回0,也就是说你那个while是个死循环。
回复

使用道具 举报

 楼主| 发表于 2006-3-23 12:15:43 | 显示全部楼层
我試过了,还是不行,指针fp->_ptr始终不能到文件结束的地方啊!
同样也死循环了啊!
回复

使用道具 举报

 楼主| 发表于 2006-3-23 12:22:59 | 显示全部楼层
程序执行后文件里原来的字符不知道什么原因变多了啊!
fseek(fp,-1L,SEEK_CUR)这个语句第二次执行时,fp->_ptr指向文件开头了,并不是当前指针后退一个字符啊!
回复

使用道具 举报

发表于 2006-3-23 14:01:31 | 显示全部楼层
多了字符因为每行都有一个换行符。
回复

使用道具 举报

发表于 2006-3-23 14:06:11 | 显示全部楼层
[code:1]
#include <stdio.h>
main()
{
    FILE *fp;
    char ch;
    int i = 0;
    fp = fopen("a.txt","r+");
    if(fp < 0)
        return;

    while((ch=fgetc(fp)) != EOF)
    {
        fseek(fp,-1L,SEEK_CUR);
        fputc(ch+4,fp);
    }

    fclose(fp);

}
[/code:1]
linux下的FILE结构没有_ptr这个成员。
回复

使用道具 举报

 楼主| 发表于 2006-3-23 14:35:42 | 显示全部楼层
谢谢!哈哈! 还是不行!
是我的机子的问题吗?不会这么离谱吧!把我弄郁闷了!
我编译了你的代码,用来读一个含有几个字符的文本文件,程序还是和以前一样,运行了就不能退出来,打开文本文件就看见很多的字符。

跟我的系统有关吗?我用的是solaris 10.
看来只有定义一个数组啦,把字符全存进去,然后rewind重新写入文件。
唉!C语言,真的好难学啊!
回复

使用道具 举报

发表于 2006-3-24 10:43:35 | 显示全部楼层
不是机子问题,可能是两个系统的fseek实现不一样,在linux下没问题。
用这个方法应该比较通用:
[code:1]
#include <stdio.h>
main()
{
    FILE *fp;
    char ch;
    int off;
    int i = 0;
    fp = fopen("a.txt","r+");
    if(fp < 0)
        return;
    off = 0;
    while((ch=fgetc(fp)) != EOF)
    {
        fseek(fp,off,SEEK_SET);
        fputc(ch+4,fp);
        off ++;
    }

    fclose(fp);

}
[/code:1]
一个一个转换效率低,一块一块地读进内存转换再写回去会快一些
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 20:23 , Processed in 0.041008 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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