FILE fopen,fseek等学习

一. fopen()函数:

1.作用: 在C语言中fopen()函数用于打开指定路径的文件,获取指向该文件的指针。

2.函数原型:

FILE * fopen(const char * path,const char * mode);
    -- path: 文件路径,如:"F:\Visual Stdio 2012\test.txt"
    -- mode: 文件打开方式,例如:
             "r" 以只读方式打开文件,该文件必须存在。
             "w" 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
            "w+" 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
             "a" 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
             "a+" 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。(原来的EOF符不保留)
            "wb" 只写打开或新建一个二进制文件,只允许写数据。
            "wb+" 读写打开或建立一个二进制文件,允许读和写。
             "ab" 追加打开一个二进制文件,并在文件末尾写数据。
             "ab+"读写打开一个二进制文件,允许读,或在文件末追加数据。   
    --返回值: 文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。        

二. fwrite()函数:

1.作用:在C语言中fwrite()函数常用语将一块内存区域中的数据写入到本地文本。

2.函数原型:

size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
    -- buffer:指向数据块的指针
    -- size:每个数据的大小,单位为Byte(例如:sizeof(int)就是4)
    -- count:数据个数
    -- stream:文件指针

注意:返回值随着调用格式的不同而不同:

    (1) 调用格式:fwrite(buf,sizeof(buf),1,fp);

    成功写入返回值为1(即count)


    (2)调用格式:fwrite(buf,1,sizeof(buf),fp);

    成功写入则返回实际写入的数据个数(单位为Byte)

3. 注意事项:

    写完数据后要调用fclose()关闭流,不关闭流的情况下,每次读或写数据后,文件指针都会指向下一个待写或者读数据位置的指针。

示例说明:

代码1:下面代码可将1024个字(int)写入到文本文件,fwrite的调用中,size是sizeof(int),count是DATA_SIZE
 

#include "stdafx.h"
#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#define DATA_SIZE 1024
 
int main()
{
    unsigned int *dataPtr = NULL;
    dataPtr = (unsigned int *)malloc(sizeof(int)*DATA_SIZE);
    for(unsigned int i=0;i

三. fread()函数:


1. 作用:从一个文件流中读取数据
2. 函数原型如下:
 

	size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
	  -- buffer:指向数据块的指针
	  -- size:每个数据的大小,单位为Byte(例如:sizeof(int)就是4)
	  -- count:数据个数
	  -- stream:文件指针

四. fseek 函数

FILE 文件结构中 , 存在一个指针 , 每次调用文件的读写函数 , 该指针就会移动 ;

如 fgets / fputs , getc / putc , fscanf / fprintf , fread / fwrite 等函数 ;

默认情况下 , 指针是从前向后移动的 ;

该文件内部的指针指向的位置可以通过 fseek 函数进行改变 ;


fseek 函数原型如下 : 重新设置文件内部指针的位置 ;

#include
int fseek(FILE *stream, long offset, int fromwhere);

设置的指针的位置是 起始位置 + 偏移量 ;

其中的 int fromwhere 参数就是 起始位置 , 有以下三种选择 :

文件头 SEEK_SET 0
当前位置 SEEK_CUR 1
文件尾 SEEK_END 2

long offset 偏移量参数 , 可以为正数 , 也可以为负数 ;

如果执行成功 , 则返回 0 , 失败返回非 0 , 并设置 error 错误代码 ;

fseek 函数代码示例 : 先写出 10 字节数据 , 然后正常读取前 2 字节 , 最后跳过 4 字节 再读取 2 字节 ;

#include 

int main()
{
    // 以写文本的方式向文件中写出数据
    FILE *p = fopen("D:/File/number.dat", "w");
    // 写出 10 个字符
    char array[10] = {1,2,3,4,5,6,7,8,9,10};
    // 将 10 个字符写出到文件中
    fwrite(array, 1, sizeof(array), p);
    // 关闭文件
    fclose(p);


    // 正常读取文件前 2 字节
    FILE *p1 = fopen("D:/File/number.dat", "r");
    // 读取数据缓冲区
    char array1[2];
    // 读取前 2 字节
    fread(array1, 1, sizeof(array1), p1);
    // 打印前 2 字节数据
    printf("%d , %d\n", array1[0], array1[1]);


    // 跳过 4 字节读取文件 2 字节
    FILE *p2 = fopen("D:/File/number.dat", "r");
    // 读取数据缓冲区
    char array2[2];

    // 跳过 4 字节 , 此时当前位置是 0
    fseek(p2, 4, SEEK_CUR);

    // 读取 2 字节
    fread(array2, 1, sizeof(array2), p2);
    // 打印前 2 字节数据
    printf("%d , %d", array2[0], array2[1]);


    return 0;
}

你可能感兴趣的:(学习)