C| 文件存取

前言:原有的项目存取数据都是写入二进制文件,我改写项目也沿用了之前的方法,但是最近在文件存取方面遇到了问题。问题主要是大数据文件存取存在丢失,所以特地来细看以下用到的文件存取函数,看看是不是有越界的地方。

数据文件

这里的文件存取主要指的是数据文件,分为ASCII文件和二进制文件。其中,ASCII文件又称文本(txt)文件。

文件类型指针

文件类型指针:无论是存还是读文件都是需要用到文件类型指针的,该FILE结构体类型包含在头文件“stdio.h”中。

FILE *fp;

fp指向某一个文件的文件信息区,里面包含文件各种信息,通过其能够访问文件。

打开和关闭文件

无论是存还是读文件都是需要先打开文件,才能进行相应的操作。
而文件打开后都需要进行关闭操作,来释放该文件的所有内存。

打开文件:

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

filename表示文件的路径。

mode表示打开后对文件操作的模式,比较常用的有:

  • 读文件:“ r ”只读文件。
  • 写文件:“ w ”只写文件,没有就会创建个新的。

如果是二进制文件就写成“ rb ”和“ wb ”。

关闭文件:

int fclose( FILE *fp );

写入文件

对于ASCII文件写入有三种:

int fputc( int c, FILE *fp );// 单个字符c写入
int fputs( const char *s, FILE *fp );// 字符串s写入
int fprintf(FILE *fp,const char *s) // 字符串s写入

示例:

#include <stdio.h>
 
int main()
{
   FILE *fp = NULL;
   fp = fopen("test.txt", "w");
   fputc('c', FILE *fp );
   fputs("Testing for fputs...\n", fp);
   fprintf(fp, "Testing for fprintf...\n");
   fclose(fp);
}

如果是二进制文件写入:

size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);

ptr是要传入数据的指针,size_of_elements是ptr数据的类型的字节数(用sizeof计算),number_of_elements数据长度。
总共要传入的字节数是size_of_elements×number_of_elements。

示例:

unsigned short* Org;
fwrite(Org, sizeof(unsigned short), size, fp);

读取文件

对于ASCII文件读取有三种:fgetc、fscanf和fgets。

fgetc每次的读取一个字符:

#include <stdio.h>
 
int main()
{
   FILE *fp = NULL;
   int c;
   fp = fopen("test.txt", "r");
   while (c != EOF)
   {
      c = fgetc (fp); // 获取一个字符
      printf("%c", c );
   }
   fclose(fp);
}

fscanf和fgets读取字符串:

#include <stdio.h>
 
int main()
{
   FILE *fp = NULL;
   char buff[255];
   // 文件中的内容:This is a test...
   fp = fopen("/tmp/test.txt", "r");
   fscanf(fp, "%s", buff);// 遇到一个换行符 '\n' 或文件的末尾 EOF,就会返回读取到的字符
   printf("1: %s\n", buff );// This
   // fgets会在上一次读到的地方继续读
   fgets(buff, 255, (FILE*)fp);// 读取255个字符,最后追null作为终止符
   printf("2: %s\n", buff );// is a test...
   
   fclose(fp);
}

如果是二进制文件读取:

size_t fwrite(const void *ptr, size_t size_of_elements,  size_t number_of_elements, FILE *a_file);

把文件内容读取到ptr指向的内容中,其它参数和写入是一样的。size_of_elements是ptr数据的类型的字节数(用sizeof计算),number_of_elements数据长度。
总共要传入的字节数是size_of_elements×number_of_elements。

文件偏移

fseek函数可以把文件指针移动到想要的文件位置。

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

whence参数:

  • SEEK_SET:文件的开头。
  • SEEK_CUR:文件指针的当前位置。
  • SEEK_END:文件的末尾。

但是注意offset限定位long int类型,大量数据定位的时候,一次定位可能会超越long int范围,导致数据丢失。

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值