前言:原有的项目存取数据都是写入二进制文件,我改写项目也沿用了之前的方法,但是最近在文件存取方面遇到了问题。问题主要是大数据文件存取存在丢失,所以特地来细看以下用到的文件存取函数,看看是不是有越界的地方。
数据文件
这里的文件存取主要指的是数据文件,分为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范围,导致数据丢失。