鱼C论坛

 找回密码
 立即注册
查看: 2407|回复: 10

C语言文件操作

[复制链接]
发表于 2015-7-4 12:48:44 | 显示全部楼层 |阅读模式
20鱼币
不是说带+号的打开方式也能读也能写吗,这样做为什么不可以
#include <stdio.h>
#include <stdlib.h>

int main()
{
        char ch;
        FILE *fp, *fp2;

        fp = fopen("1.txt", "w+");
        fprintf(fp, "abc");
        fp2 = fopen("2.txt", "w+");
        while( !feof(fp) )
        {
                ch = fgetc(fp);
                fputc(ch, fp2);
        }
        while( !feof(fp2) )
        {
                ch = fgetc(fp2);
                putchar(ch);
        }
        
        fclose(fp);
        fclose(fp2);

        system("pause");
        return 0;
}

最佳答案

查看完整内容

无论读或者写,”文件读写位置指针“都会发生移位,所以每次进行读写的重置“文件读写位置指针”就可以了,我修改后的代码如下: 希望楼主采纳,我没鱼币了:cry
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-4 12:48:45 | 显示全部楼层
无论读或者写,”文件读写位置指针“都会发生移位,所以每次进行读写的重置“文件读写位置指针”就可以了,我修改后的代码如下:
#include <stdio.h>
#include <stdlib.h>

int main()
{
        char ch;
        FILE *fp, *fp2;

        fp = fopen("1.txt", "w+");
        fprintf(fp, "abc");
        fp2 = fopen("2.txt", "w+");

                fseek(fp,0,SEEK_SET);
        while( !feof(fp) )
        {
                ch = fgetc(fp);
                fputc(ch, fp2);
        }

                fseek(fp2,0,SEEK_SET);
        while( !feof(fp2) )
        {
                ch = fgetc(fp2);
                putchar(ch);
        }
        
        fclose(fp);
        fclose(fp2);

        system("pause");
        return 0;
}
希望楼主采纳,我没鱼币了:cry

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
哥斯拉不说话 + 1 + 1 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-4 20:23:20 | 显示全部楼层
第一个文件一直在写,两个while没有停下来的标志,在循环最后加break;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-7-4 22:20:29 | 显示全部楼层
微笑A007 发表于 2015-7-4 20:23
第一个文件一直在写,两个while没有停下来的标志,在循环最后加break;

加了break不就只能循环一次了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-4 23:17:41 | 显示全部楼层
哥斯拉不说话 发表于 2015-7-4 22:20
加了break不就只能循环一次了吗?

The feof routine (implemented both as a function and as a macro) determines whether the end of stream has been reached. When end of file is reached, read operations return an end-of-file indicator until the stream is closed or until rewind, fsetpos, fseek, or clearerr is called against it.

楼主 你这是直接以写的方式打开了两个文件
意思是把1.txt的内容直接写到2.txt内
如果1.txt没有文件结束符, 那么就会无限的往2.txt里写

楼主 你1.txt里的内容是啥 能上传下不
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-4 23:48:21 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>

int main()
{
        char ch;
        FILE *fp, *fp2;

        fp = fopen("1.txt", "w+");
        fprintf(fp, "abc");
        fclose(fp);

        fp = fopen("1.txt", "r");
        fp2 = fopen("2.txt", "w+");
        while( !feof(fp) )
        {
                ch = fgetc(fp);
                fputc(ch, fp2);
        }

        fclose(fp2);
        fp2 = fopen("2.txt", "r");
        while( !feof(fp2) )
        {
                ch = fgetc(fp2);
                putchar(ch);
        }


        system("pause");
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-4 23:51:01 | 显示全部楼层
本帖最后由 ryxcaixia 于 2015-7-5 10:18 编辑

楼主 这里说明两点
第一 如果一个文件流没有关闭(或程序退出) 那么无论往里写入都少 都相当于白写 所以之前的结构中 fp往1.txt中写入abc, 但是并没有关闭, 所有1.txt中自然是空 然后fp2马上读取1.txt, 自然是无限读取

第二 当fp往1.txt中写完后 此时文件指针在文件的结尾处, 即第四个字节的位置上, 这个时候要么利用fseek移动文件指针, 要么重新打开一次这个文件, 让文件指针指向文件头的位置

至于为何会发生第一种情况 在我模糊的记忆中 c++ primer第八章中的文件读写中 貌似有这样一段描述 大概意思是说 当前文件流同时只能存在一个 要打开另一个进行有效读写 则要关闭当前的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-7-5 11:06:18 | 显示全部楼层
ryxcaixia 发表于 2015-7-4 23:51
楼主 这里说明两点
第一 如果一个文件流没有关闭(或程序退出) 那么无论往里写入都少 都相当于白写 所以之 ...

那那个打开文件的“w+”的‘+’不就没有任何意义了吗,跟“w”的用法一样了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-5 13:05:32 | 显示全部楼层
哥斯拉不说话 发表于 2015-7-5 11:06
那那个打开文件的“w+”的‘+’不就没有任何意义了吗,跟“w”的用法一样了

亲 请注意 这个和w 带不带+没关系

无论带不带+号 如果在一个文件流没关闭的时候 你马上打开另一个文件流 那么前一个文件流的操作操作都是无效的

就算不带+
你直接
        FILE *fp, *fp2;

        fp = fopen("1.txt", "w");
        fprintf(fp, "abc");
        fp2 = fopen("2.txt", "w");  // 这就有明显出问题 fp的文件流还没关闭 你马上打开了第二个文件流 这和带不带+号已经没关系了 已经无法写入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-7-5 14:32:26 | 显示全部楼层
ryxcaixia 发表于 2015-7-5 13:05
亲 请注意 这个和w 带不带+没关系

无论带不带+号 如果在一个文件流没关闭的时候 你马上打开另一个文件 ...

我看书上写的。
w+:首先建立一个新文件,进行写操作,随后可以从头开始读。如果指定文件已存在,则原有的内容将全部消失。
r+: 为读和写而打开文本文件。用这种方式时,指定的文件应当已经存在,既可以对该文件进行读,也可以对该文件进行写,在读和写操作之间不必关闭文件。

我是这样测试的 r+ 的,没有得到我想得到的结果(1),但文件里有一个 '1' 还有一个 '?' , 不知道是我理解错了还是测试程序写的不对。
#include <stdio.h>

int main()
{
        int a=0;
        FILE *fp;
        
        fp = fopen("test.txt", "w");
        fclose(fp);

        fp = fopen("test.txt", "r+");
        fprintf(fp, "1");
        fscanf(fp, "%d", &a);

        printf("a = %d\n", a);

        fclose(fp);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-5 20:33:07 | 显示全部楼层
本帖最后由 ryxcaixia 于 2015-7-5 20:42 编辑

121


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 04:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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