dd手术

  这些天都在和文件的操作打交道。零零散散的见识了不少对文件的操作方法,所以先整理一下。以免要用的时候找不到。

一:C语言中对文件的操作方法。

c语言对文件的操作是通过FILE指针,通过fopen函数打开文件,通过fwrite函数向文件中写入数据

FILE *fopen( const char *filename, const char *mode );

其中filename是要打开的文件名,mode为打开的模式,mode的取值为

r----只读。                             

w------写入(每次打开时会先清空文件)                              

a-----在文件的末尾添加

r+------读写,文件必须存在    w+-----读写。如果文件不存在就自动创建

a+------打开和添加,添加前会自动清除EOF标志,添加结束后会自动添加EOF.

t---------以文本方式打开(系统自动会以CTRL+Z为文件结束,并且在碰到每行换行的时候加上换行符。但是在读取文件内容的时候自动丢弃。所以实际文件的大小比写入的内容要大。

b----以二进制方式打开,文件内容的组织方式就是数据在内存中的组织方式。

 

size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );这个函数返回实际往文件中所写入的数目。

buffer:缓冲区,指向被写入文件的数据。C语言中对文件的读取设定了一个缓冲区的概念,数据会先暂时存在在缓冲去中,一旦缓冲区填满或者文件关闭,才将数据写入文件(当然可以调用fflush函数来立即将缓冲区的数据写入文件)

size:以字节为单位的项的大小。

count:项的个数。比如要写入6个字符。项的大小为1个字节的话,count为6,如果项的大小为2个字节的话,count为3.

*stream:文件的指针(在调用fwrite函数前要先调用fopen打开文件,得到一个指向FILE类型的指针。在写入文件的时候将它传入即可)

文件的关闭。在对文件操作结束以后,要及时关闭文件,否则就会出现错误。

C语言中调用fclose()函数来完成对文件的关闭操作。

int _fcloseall( void );

int fclose( FILE *stream )

关闭成功返回0,失败返回EOF(-1)

文件的定位。在C语言中对文件的定位操作通过函数fseek()来实现。

int fseek( FILE *stream, long offset, int origin )

stream:指向FILE结构体的指针(由fopen得到)

offset:偏移量,是起始位置的偏移量.

origin:起始位置。取值为:

fseekSEEK_CUR(当前指针的位置。一般来说,每次写入文件以后,指针都在文件的末尾)

SEEK_END(文件的末尾)

SEEK_SET:文件的起始位置

并且,这个函数在以文本方式打开文件的时候是由限制的,因为和二进制文件不同,文本文件插入了很多格式控制符。以下是MSDN的描述

  • Seeking with an offset of 0 relative to any of the origin values.
  • Seekingfrom the beginning of the file with an offset value returned from acall to ftell.(ftell returns the current file position, The valuereturned by ftell may not reflect the physical byte offset for streamsopened in text mode)。
  • 文件的读取:调用fread函数读取文件的内容。

 

fread

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );

fread函数返回读取的字符个数

buffer:缓冲区

size:项的大小

count:项的个数

*stream:指向FILE的指针。

在读取文件内容的时候要注意在缓冲区的后面加上\0,不如会出现乱码。

也可以在设定缓冲区的大小的时候先调用memset函数,将缓冲区里面的内容全部设为0

void *memset( void *dest, int c, size_t count );

也可以先调用fseek函数将文件指针指向文件的末尾,软后调用ftell函数得到文件的长度,

这样在分配缓冲区的的时候就可以多分配一个字符的空间来存放\0了。

现在我们通过一个程序的例子来使用以上函数

#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main()
{
    FILE *fp;
    fp=fopen("1.txt","w");
    //向文件中写入数据
    fwrite("C语言对文件的操作",1,strlen("C语言对文件的操作"),fp);
    //无缓冲形式的写入,一旦缓冲区里面接受到字符,就立即写入文件
//    fflush(fp);

    //向文件的开头插入数据,新插入的数据会覆盖原来的数据
    fseek(fp,0,SEEK_SET);
    fwrite("欢迎学习...",1,strlen("欢迎学习..."),fp);
    fclose(fp);

    //插入数据,不覆盖原来的内容
    fp=fopen("1.txt","a+");
    fwrite("C语言对文件的操作",1,strlen("C语言对文件的操作"),fp);
    fseek(fp,0,SEEK_SET);
    fwrite("欢迎学习...",1,strlen("欢迎学习..."),fp);
    fclose(fp);

    //读取文件的内容,并且显示在屏幕上面
    fp=fopen("1.txt","r");
    char buffer[100];
    memset(buffer,0,100);
    fread(buffer,1,100,fp);
    for(int i=0;i<100;i++)
    {
        if(buffer[i])
            printf("%c",buffer[i]);
    }
    fclose(fp);

    //读取文件的内容,事先得到文件的长度后再分配缓冲区
    fp=fopen("1.txt","r");
    fseek(fp,0,SEEK_END);
    int len = ftell(fp);
    char *buffer1=(char*)malloc(len+1);
    fread(buffer1,1,len,fp);
    buffer1[len]='0';
    fclose(fp);
    for(i=0;i<len;i++)
        printf("%c",buffer1[i]);
    free(buffer1);


    return 0;        
}

posted @ 2012-07-03 00:48  dengyigod  阅读(117)  评论(0)    收藏  举报