| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2312 人关注过本帖, 1 人收藏
标题:C 文件操作函数
只看楼主 加入收藏
US-COS
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-11-28
收藏(1)
 问题点数:0 回复次数:1 
C 文件操作函数
//------------------------------------------------------------------------------
宏 EXIT_SUCCESS   程序成功终止
宏 EXIT_FAILURE   程序非成功终止
//------------------------------------------------------------------------------
/----------------------------------------------------------\
|              标准文件及与其相关联的文件指针              |
|----------------------------------------------------------|
|  标 准 文 件          文 件 指 针         一般使用的设备 |
|   标准输入              stdin                  键盘      |
|   标准输出              stdout                显示器     |
|  标准错误输出           stderr                显示器     |
\----------------------------------------------------------/
   
//------------------------------------------------------------------------------
FILE * fp;
char fname[33] = "文件名";
if((fp = fopen(fname, "r")) != NULL)  // 如果成功打开文件
{
}
fclose(fp);               // 关闭fp指向的文件
//------------------------------------------------------------------------------

FILE * fp;
char arr[7] = "文件名";
fp = fopen(arr, "r");
if(fp != NULL)
    fclose(fp);    // 关闭fp指向的文件
 
ch = getc(stdin);  // 相当于 getchar();    一般 getchar() 是由 getc() 函数定义的
putc(ch, stdout);  // 相当于 putchar(ch);  一般 putchar() 是由 putc() 函数定义的

//------------------------------------------------------------------------------
fopen()    接受两个参数,第一个是文件名字符串,第二个是打开方式
           如果没有成功打开文件,fopen() 函数返回 NULL,
           否则返回 FILE 指针
    //--------------------------------------------------------------------//
    //              表 13.1       fopen()函数的模式字符串                 //
    //--------------------------------------------------------------------//
    //  模式字符串    |                         意义                      //
    //--------------------------------------------------------------------//
    // "r"            |  打开一个文本文件,可以读取文件                   //
    //--------------------------------------------------------------------//
    // "w"            |  打开一个文本文件,可以写入文件,先将文件的长度截 //
    //                |  为零。如果该文件不存在则先创建之                 //
    //--------------------------------------------------------------------//
    // "a"            |  打开一个文本文件,可以写入文件,向已有文件的结尾 //
    //                |  追加内容,如果该文件不存在则先创建之             //
    //--------------------------------------------------------------------//
    // "r+"           |  打开一个文本文件,可以进行更新(读取和写入)     //
    //--------------------------------------------------------------------//
    // "w+"           |  打开一个文本文件,可以进行更新(读取和写入),如 //
    //                |  果该文件存在则首先将其长度截为零;如果不存在则先 //
    //                |  创建之                                           //
    //--------------------------------------------------------------------//
    // "a+"           |  打开一个文本文件,可以进行更新(读取和写入),向 //
    //                |  已有文件的尾部追加内容,如果该文件不存在则先创建 //
    //                |  之;可以读取整个文件,但写入时只能追加内容       //
    //--------------------------------------------------------------------//
    // "rb",   "wb",  |  与前面的模式相似,只是使用二进制模式而非文本模式 //
    // "ab",   "r+b", |  打开文件                                         //
    // "w+b",  "a+b", |                                                   //
    // "rb+",  "wb+", |                                                   //
    // "ab+"          |                                                   //
    //--------------------------------------------------------------------//
fclose()   接受一个参数,函数关闭 fopen() 函数打开的文件
           如果文件成功关闭,fclose() 返回值0,否则返回 EOF
           磁盘已满、磁盘被移走或者I/O错误等等都会导致 fclose() 函数执行失败。
           
//------------------------------------------------------------------------------

fprintf()  与printf() 相似 但需要第一个 FILE 指针参数来指定要操作的文件
           fprintf(stdout, "COS.\n"); 等同与 printf("COS.\n");
            
fscanf()   与scanf() 相似 但需要第一个 FILE 指针参数来指定要操作的文件
           fcanf(stdin, "%s", words); 等同与 scanf("%s", words);
           
fgets()    fgets(words, 5, stdin); 第一个是字符串数组名,第二个是字符串大小,
           第三个是 FILE 指针
  
fputs()    fputs(words, stdout);   第一个是字符串数组名,第二个是 FILE 指针
getc()   getc(fp) 接受一个 FILE 指针参数,返回指向的 char 字符
putc()   putc(ch, stdout) 接受2个参数,第一个参数是一个字符,第二个参数是
         FILE 指针参数。
 
//------------------------------------------------------------------------------
rewind()   接受一个 FILE 指针参数  作用是:回到文件开始处
    /-------------------------------------------------\
    |             文件的起始点模式                    |
    |-------------------------------------------------|
    |    模 式                     偏移量的起始点     |
    |    SEEK_SRT                     文件开始        |
    |    SEEK_CUR                     当前位置        |
    |    SEEK_END                     文件结尾        |
    \-------------------------------------------------/

fseek()    fseek() 接受3个参数,返回 int 值。
           第一个参数是一个指向被搜索文件的 FILE 指针。因该已经使用 fopen()
               打开了该文件。
           第二个参数成为偏移量(offset),表示从起始点开始要移动的距离
               这个参数必须是一个 long 类型的值,可以为正(前移)、负(后移),
               也可以为零(保持不动)。
           第三个参数是模式,用来标识起始点。在ANSI下,stdio.h 头文件制定了下
               列模式敞亮:
                 模式              偏移量的起始点
               SEEK_SET              文件开始
               SEEK_CUR              当前位置
               SEEK_END              文件结尾
                   以前实现中可能没有这些定义,而是用数字值0L、1L和2L分别代表
               这些模式。(L 后缀标识 long 类型值)   
           函数允许您像对待数组那样对待一个文件,在 fopen() 打开的文件中直接移
           动到任意字节处。
           fseek(fp, 0L, SEEK_SET);    // 找到文件的开始处
           fseek(fp, 10L, SEEK_SET);   // 找到文件的第11个字节
           fseek(fp, 2L, SEEK_CUR);    // 从文件的当前位置向前移动2个字节
           fseek(fp, 0L, SEEK_END);    // 到达文件结尾处
           fseek(fp, -10L, SEEK_END);  // 从文件结尾处退回10个字节
               如果一切正常,fseek()的返回值为0。如果有错误出现,例如试图移动超
           出文件范围,则fseek()的返回值为-1。
            
ftell()    函数以一个 long 类型值返回一个文件的当前位置。在ANSIC下,ftell()函数
           在stdio.h头文件中被声明。像最初在UNIX中实现的那样,ftell()函数通过返
           回局文件开始处的字节数目来确定文件的位置。文件的第一个字节到文件开始
           处的距离是字节0,依次类推。 在ANSI C下,这种定义适用于一二进制模式打
           开的文件,但是对于以文本模式打开的文件来讲,不一定是这样。
               ANSI C规定,对于文本模式,ftell()返回一个可以用作fseek()的第二个
           参数的值。例如,MS-DOS,ftell()返回一个将\r\n看成一个字节的计数值。
           
//----------------------------------------------------------------------------//
    fseek() 和 ftell() 函数的一个潜在问题是它们限制文件的大小只能在 long类型
的表示范围之内。随着日益增长的存储设备容量使得更大的文件也成为可能。
    ANSI C引入了两个用来处理较大文件的新的定位函数。这两个函数不是采用long类
型,而是使用一种称为 fpos_t(代表 file position type,文件定位类型)的新类型
来代表位置。fpos_t不是一种基本类型,而是通过其他类型定义的。一个fpos_t类型的
变量或者数据对象可以用来制定文件中的一个位置,它不能是一种数组类型,但除此之
外不再有其他限制。因此C实现可以提供一种满足特殊平台需要的类型; 例如,这种类
型可以作为结构来实现。
    ANSI C定义了使用fpos_t的方法。fgetpos() 函数具有下面的原型:
   
    int fgetpos(FILE * restrict stream, fpos_t * restrict pos);
   
    被调用时,该函数在pos所指的位置放置一个fpos_t值;这个值描述了文件中的一个
位置。如果成功,函数返回0,否则返回一个非零值。
   
    fsetpos() 函数具有下面的原型:
   
    int fsetpos(FILE * stream, const fpos_t * pos);
   
    被调用时,该函数使用 pos指向的位置上的那个fpos_t值设定文件指针指向该值所指
示的位置。如果成功,函数返回0;否则返回一个非零值。这个fpos_t值应是通过调用
fgetpos() 函数获得的。
fgetpos()
fsetpos()
//----------------------------------------------------------------------------//



//----------------------------------------------------------------------------//
                  二进制I/O:fread() 和 fwrite() 函数
//----------------------------------------------------------------------------//

fwrite()函数的原型是:
    size_t fwrite(const void * restrict ptr,
                  size_t size,
                  size_t nmemb,
                  FILE * restrict fp
                 );
        fwrite() 函数将二进制数据写入文件。size_t类型是根据标准C类型定义的。
    它是sizeof运算符返回的类型,通常是unsigned int类型,不过具体的实现中可以
    选择其他类型。
        指针 ptr 是要写入的数据块的地址。size 表示要写入的数据块的大小(以字
    节为单位)。nmemb 表示数据块的数目。fp 指定要写入的文件。 例如,要保存一
    个 256 字节大小的数据对象(例如一个数组),可以这样做:
   
      char arr[256];
      fwrite(arr, 256, 1, fp);
      
      这个函数调用一次将 256 字节大小的arr数组写入到文件。
      
      或者
          double ent[10];
          fwrite(ent, sizeof(double), 10, fp);
        这个函数调用将 ent 数组中的数据写入文件,数据分成10块,
      每块都是 double 大小。
          fwrite() 中的 void * ptr。
         
        fwrite() 的一个问题就是它的第一个参数不是一个固定类型。
        在 ANSI C 函数原型下,这些实际参数都被转换成为指向 void 的指针,这种
    指针可以作为一种普通的指针类型工作(ANSI C以前的C对这一参数使用char * 类
    型,需要将实际参数的类型指派为这一类型)。
        fwrite()函数返回成功写入的项目数。 正常情况下,它与nmemb相等,不过如
    果有写入错误的话返回值就会小于 nmemb。
//----------------------------------------------------------------------------//
fread() 函数的原型是:
    size_t fread(void * restrict ptr,
                 size_t size,
                 size_t nmemb,
                 FILE * restrict fp
                );
    ptr 为存储读入的文件数据的内存地址,fp 制定要读取的文件。
    使用这个函数来读取通过 fwrite() 写入的文件数据。
      例如,要恢复前一个例子中保存的包含10个double值的数组,可以使用以下函数
    用调:
      fread(ent, sizeof(double), 10, fp);
      
      该调用将10个double值复制到ent数组中。
        fread() 函数返回成功读入的项目数。正常情况下,它与 nmemb 相等;不过
    如果有读取错误的话,返回值就会小于 nmemb。
//----------------------------------------------------------------------------//
    int feof(FILE * fp) 和 int ferror(FILE * fp) 函数
        当标准输入函数返回 EOF 时,通常表示已经到达了文件结尾。 可是,这也有
    可能表示发生了读取错误。使用 feof() 和 ferror() 函数可以区分这两种可能性。
    如果最近一次输入调用监测到文件结尾, feof() 函数返回一个非零值,否则返回
    零值。如果发生读取错误,ferror() 函数返回一个非零值,否则返回零值。
   
//----------------------------------------------------------------------------//

[[italic] 本帖最后由 US-COS 于 2007-11-29 07:44 编辑 [/italic]]
搜索更多相关主题的帖子: 函数 文件 
2007-11-28 22:34
US-COS
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-11-28
收藏
得分:0 
/* C 的类型限定词 */

const:不变的 用于定义一个常量  (C90)
volatile:易变的  (C90)
    volatile 用于硬件地址和与其他并行运行的程序共享的数据。
    例如,一个地址中可能保存着当前的时钟时间。不管程序做些什么,该地址
    的值都会随着时间而改变。
    另一种情况是一个地址被用来接收来自其他程序 (或其它计算机) 的信息。
   
    一个值可以同时是 volatile 和 const
    volatile const int loc;        // 顺序并不重要
    const volatile int  * ploc;       // 顺序并不重要

restrict:   (C99)
    通过允许编译器优化某几种代码增强了计算支持。它只可用于指针,
    并表明指针是访问一个数据对象的唯一且初始的方式。
    使用restrict作为指针型函数参数的限定词使用。这意味着编译器可以假定
    在函数体内没有其他标识符修改指针指向的数据,因而可以试着优化代码,
    反之则不然。
        关键字 restrict 有两个读者。一个是编译器,它告诉编译器可以自由
    地做一些有关优化的假定。另一个读者是用户,它告诉用户仅适用满足
    restrict 要求的参数。一般,编译器无法检查您是否遵循了这一限制,如果
    您蔑视它也就是在让自己冒险。

[[italic] 本帖最后由 US-COS 于 2007-11-29 07:45 编辑 [/italic]]
2007-11-28 22:35
chump345
Rank: 1
来 自:家里蹲大学
等 级:新手上路
帖 子:108
专家分:5
注 册:2007-11-24
收藏
得分:0 
可能不是你的问题~ 是服务器出了问题~

凤凰涅磐,浴火重生!

2007-11-28 22:38
Uc-Sun
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2007-11-28
收藏
得分:0 
存储类型
//------------------------//---------------------------------------------------//
//    C 的 5 种存储类     //
//------------------------//
存储类               时期   作用域  链接   声明方式
 
自动                 自动   代码块       代码块内,可选使用关键字auto
寄存器               自动   代码块       代码块内,使用关键字 register
具有外部链接的静态   静态   文件    外部   所有函数之外
具有内部链接的静态   静态   文件    内部   所有函数之外,使用关键字 static
空链接的静态         静态   代码块       代码块内,使用关键字 static

[[italic] 本帖最后由 Uc-Sun 于 2007-11-29 07:54 编辑 [/italic]]
2007-11-28 22:44
Uc-Sun
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2007-11-28
收藏
得分:0 
//------------//---------------------------------------------------------------//
//    结构    //
//------------//
struct we
{
    int n;
    char ch;
} tes;
struct test
{
    int n;
    char ar[21];
    double pai;
};

struct test a;
struct test b =
{
    20,
    "C Primer Plus",
    3.1415964
};
struct test c =
{
    .ar = "C Primer Plus",
    3.1415964
};
struct test_t
{
    struct test t;
    int n;
};
struct test_t d =
{
    {
        2,
        "Cs",
        3.14,
    },
    2
};
d.t.n;
d.t.ar;
struct test_t * p = d;
p->t.n;
p->t.ar;
//-----------//----------------------------------------------------------------//
//    联合   //
//-----------//
union hold {
    int digit;
    double bigfl;
    char letter;
};
union hold fit;         // hold 类型的联合变量
union hold save[10];    // 10个联合变量的数组
union hold * pu;        // 指向hold类型变量的指针

union hold vala;
vala.letter = 'r';
union hold valb = vala;               // 把一个联合初始化为零一个联合
union hold valc = {88};               // 初始化联合的digit成员
union hold vald = {.bigfl = 118.2};   // 指定初始化项目
联合中同时只能存在一种类型。
//-----------//----------------------------------------------------------------//
//    枚举   //
//-----------//
    可以使用枚举类型(enumerated type)声明代表整数常量的符号名称。通过关键字enum,
可以创建一个新“类型”并指定它可以具有的值(实际上,enum常量是int 类型的)。
enum spect {red, orange, yellow};    // 枚举常量
enum spect color;         // 声明一个spect类型的变量
for(color = red; color <= yellow; color++)
{
}
    red 和 orange 到底是什么?从技术上讲,它们是int 类型的敞亮。
默认情况下,枚举列表中的常量被指定为整数值0、1、2等等。
    您可以选择常量具有的整数值。
    enum levels {low = 100, medium = 500, high = 2000};
    如果只对一个常量赋值,而没有对后面的常量赋值,那么这些后面的
常量会被赋予后续的值。

//-----------------------------------------------------------------------------//

[[italic] 本帖最后由 Uc-Sun 于 2007-11-29 07:55 编辑 [/italic]]

COS-DOS
2007-11-28 22:52
Uc-Sun
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2007-11-28
收藏
得分:0 
SIZE:
sizeof       类型或变量的大小,以字节计
sizeof(int)  int 大小
sizeof a     变量 a 的大小

运算符:
+ 加
- 减
* 乘
/ 除
% 求余数
赋值运算符:
=
+=  
-=
*=
/=
%=
比较运算符:
<   小于
>   大于
==  等于
<=  小于等于
>=  大于等于
!=  不等于
逻辑运算符:
!   
&&  
||  
指针:
&  取址
*  取值
位运算符:
&  位与
|  位或
^  异或
~  取反
<< 位移
>> 位移

[[italic] 本帖最后由 Uc-Sun 于 2007-11-29 07:56 编辑 [/italic]]

COS-DOS
2007-11-28 22:53
Uc-Sun
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2007-11-28
收藏
得分:0 
malloc() calloc() free()
分配内存: malloc() 和 free()
在头文件 stdlib.h 中有 malloc() 和 free() 的原型
malloc():接受一个参数,所需内存字节数。然后 malloc() 找到可用
    内存中一个大小适合的块。返回那块内存第一个字节的地址。
    因为 char 代表一个字节,所以传统上曾将 malloc() 定义为指向
    char 的指针类型。然而 ANSI C 标准使用了一个新类型:指向
    void 的指针。 这一类型被用作“通用指针”。函数 malloc() 可
    用来返回数组指针、结构指针等等,因此一般需要把返回值的类型
    指派为适合的类型。在 ANSI C 中,为了程序清晰应对指针进行类
    型指派,但将 void 指针值赋值给其他类型的指针并不构成类型冲
    突。如果 malloc() 找不到所需的空间,它将返回空指针。
    double * ptd;
    ptd = (double *)malloc(30 * sizeof(double));
    这段代码请求 30个 double 类型值得空间,并把ptd指向空间所在的位
    置。注意 ptd是作为指向一个 double 类型值的指针声明的,而不是指
    向 30 个 double 类型值的数据块的指针。记住:数组的名字是它第一
    个元素的地址。因此,如果您令 ptd指向一个内存块的第一个元素,就
    可以像使用数组名一样使用它。也就是说,可以使用表达式 ptd[0] 来
    访问内存的第一个元素,ptd[1]来访问第二个元素,依次类推。正如前
    面所学,可以在指针符号中使用数组名,也可以在数组符号中使用指针。
calloc():ANSI C 以前版本中返回一个 char 指针,在 ANSI C 中返回
    一个 void 指针。如果要存储不同类型,应该使用类型指派运算符。
    这个新函数接受两个参数,都应是无符号的整数(在 ANSI 中是 size_t 类型)。
    第一个参数是所需内存单元的数量,第二个参数是每个单元以字节计的大小。
    long * newmen;
    newmem = (long *)calloc(100, sizeof(long));
    在这里,long 使用4个字节,因此这一指令建立了100个4字节单元,总共使用400个字节来存储。
free():接受一个参数,指向 malloc() 分配的内存的第一个字节的地址。(即malloc()返回的那个值)
    free() 函数释放 malloc() 分配的内存;或释放 calloc() 分配的内存。不能使用 free() 来释放
    通过其它方式分配的内存。

exit() 函数用来在内存分配失败时结束程序。值 EXIT_FAILURE 也在这个头文件中定义。
标准函数库提供了两个能够保证早所有操作系统下工作的返回值:
    EXIT_SUCCESS (或者,等同于0) 指示程序正常终止。
    EXIT_FAILURE 指示程序异常终止。有些操作系统,包括UNIX、Linux 和 Windows,能够接受其他的整数值。

[[italic] 本帖最后由 Uc-Sun 于 2007-11-29 07:57 编辑 [/italic]]

COS-DOS
2007-11-28 23:01
快速回复:C 文件操作函数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023852 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved