回 帖 发 新 帖 刷新版面

主题:关于fopen函数

先贴上《C Primer Plus》一书里的程序:

/* count.c -- 使用标准I/O */
#include <stdio.h>

#include <stdlib.h> //ANSI C的exit()原型
int main(int argc, char* argv[])
{
    int ch;         // 读取时存储每个字符的位置
    FILE *fp;       // 文件指针
    long count = 0;
    
    if(argc != 2)
    {
        printf("Usage:%s filename\n", argv[0]);
        exit(1);
    }
    if((fp = fopen(argv[1], "r")) == NULL)
    {
        puts("这里又是什么意思?");
        printf("Can't open %s\n", argv[1]);
        exit(1);
    }
    while((ch = getc(fp)) != EOF)
    {
        putc(ch, stdout);   // 相当于putchar(ch);
        count++;
    }
    fclose(fp);
    printf("File %s has %ld characters\n", argv[1], count);

    return 0;
}


    我用的是Dev-c++编译器,在XP系统下,5.1.2600的命令行版本
在目录下有三个文件,分别是:count.c、count.exe、count.txt

特别说明:count.txt文件是我用来测试自己对于知识的掌握程度而特别建立的。
内容是:Hello World! 

在命令行窗口下,我键入count count.txt
屏幕上显示:Hello World! File count.txt has 13 characters

    我的问题就是关于fopen函数的模式字符串。
程序中用了的"r"模式,只读取文件。

可是,我在试验别的模式的时候,比如"w"。为啥只是删除了文本文件内的内容,却不让我进行写入操作。"a"或"r+"也不能进行写入操作……

是我根本不懂呢?还是其它的原因?

一开始我以为还要调用什么能写入文件的函数,可转念一想,不对啊,fopen函数能提供这个模式字符串进行写入,那就应该能直接写入文件的,可我不能啊。纠结啊。

还有一个问题。

书里对于fopen函数的模式字符串给出了一个表,写出来是为了能更好的说明问题,表格就不画了。

    模式字符串            意义
"r"                读取文本文件。
"w"                写入文本文件,先将文件的长度截为零,如果该文件不存在则先创建之。
"a"                写入文本文件,向已有文件的尾部追加内容,如果该文件不存在则先创建之。
"r+"                更新文本文件,即可以读取和写入。
"w+"                更新文本文件(读取和写入),如果该文件存在则首先将其长度截为零,如果不存在则先创建之。
"a+"                更新文本文件(读取和写入),向已有文件的尾部追加内容,如果该文件不存在则先创建之,可以读取整个文件,但写入时只能追加内容。

"rb", "wb", "ab", "ab+",     与前面的模式相似,只是使用二进制模式而非文本模式打开文件
"a+b", "wb+", "w+b", "ab+"
"a+b"

我的第二个问题就在这里,上面的"ab+"和"a+b"是一样的吗?我自己在测试的时候,没有什么不同,屏幕显示的内容一样,仍然不能进行写入操作……书里给出的表,"ab+"和"a+b"还重复出现了两次……是作者笔误了呢,把其中的一个r写成a,还是确实有其它的用途,唉,郁闷呐。

我在百度上查过,许多人给出的答案又不一样了,说fopen函数的模式字符串可以用6个字符组成

r(read)    读
w(write)     写
a(append)    追加
t(text)    文本模式
b(banary)    二进制模式
+      读取和写入

如果按这个表,可以用和r, w, a和b, t, +组合或不组合出许多个字符串

+和b的位置是谁先谁后都是无所谓的吗?反正测试"a+b"和"ab+",两者在屏幕上的输出结果是一模一样

我都迷糊了,求高手指点,先谢谢了,感激不尽,感激不尽。貌似每一次我在论坛发贴,都是写好多好长……

回复列表 (共3个回复)

沙发

一、如果想写入文件,你可以试一下fp = fopen("1.txt", "w"),然后fprintf(fp, "输出内容");也就是说打开文件后是需要调用函数来写入的,fopen只是负责以某种模式打开文件(其实就是获得了对该文件某方面操作的权限),并返回文件指针(句柄)以供操作。其实程序里的putc也可以输出,putc('a', fp);就可以了,前提是以写方式打开文件。

二、ab+和a+b是应该是一样的。这点我参考了以下资料:http://publib.boulder.ibm.com/infocenter/tpfhelp/current/index.jsp?topic=%2Fcom.ibm.ztpf-ztpfdf.doc_put.cur%2Fgtpc2%2Fcpp_fopen.html

板凳

豁然开朗……
谢谢了啊。
果然是要调用写入函数的……

3 楼

fopen() Mode         open() Flags

r or rb              O_RDONLY
w or wb              O_WRONLY|O_CREAT|O_TRUNC
a or ab              O_WRONLY|O_CREAT|O_APPEND
r+ or rb+ or r+b     O_RDWR
w+ or wb+ or w+b     O_RDWR|O_CREAT|O_TRUNC
a+ or ab+ or a+b     O_RDWR|O_CREAT|O_APPEND

打开文件的方式只能是左边的各种方式之一,否则都应该叫做 未定义的行为。

 t(text)    文本模式  // 其实没有这个模式
如果不加 b 表示的就是文本模式,但是不能加t来指定

我来回复

您尚未登录,请登录后再回复。点此登录或注册