文件
FILE
1 2 3 4 5 typedef struct _iobuf { void * _Placeholder; }FILE; _ACRTIMP _ALT FILE* __cdecl __acrt_iob_func(unsigned _Ix);
实际就是一个无符号整型ID值,当做了形式为指针来用了。
为什么要用指针,是为了防止单纯的整型随意被赋值,而不同类型的指针不可以随意赋值,因此可以用指针来阻挡一下,出错概率就小了。
mode
mode是以内存视角来说的:
从设备写入到内存中是input,是"r"
;
从内存中写出到磁盘是output,是"w"
。如果文件存在,则删掉内容,从0开始写。
fopen
1 2 3 4 5 int main () { FILE * file = fopen("e:\\aa.txt" , "w" ); fclose(file); }
\
是转义字符,所以,\\
表示\
。如果不想写\\
,也可以只写一个/
写东西
文件中有两个流,输出流和输入流,两个流的指针位置互相独立、互不干扰。指针位置可以用fseek
、fsetpos
等改变。
在这里用fwrite写入文件:Write block of data to stream.
1 2 3 4 5 6 size_t fwrite (const void * ptr, size_t size, size_t count, FILE * stream) ;
1 2 3 4 5 6 7 8 9 10 int main () { int val = 24 ; FILE * file = fopen("e:\\aa.txt" , "w" ); if (NULL == file) return 0 ; size_t byte_written = fwrite(&val, sizeof val, 1 , file); fclose(file); file = NULL ; }
程序中读文件
如果已经有存在的文件,则就不要再执行写入的部分。需要用宏条件语句来控制程序。
fread是Read block of data from stream.
1 size_t fread (void * ptr, size_t size, size_t count, FILE * stream) ;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 int main () { FILE * file = NULL ; #ifdef _CREATE_FILE__ int val = 24 ; file = fopen("e:\\aa.txt" , "w" ); if (!file) return 0 ; size_t num_written = fwrite(&val, sizeof val, 1 , file); #else int val = 0 ; file = fopen("e:\\aa.txt" , "r" ); size_t size_to_read = sizeof val; if (!file) return 0 ; size_t num_read = fread(&val, sizeof val, 1 , file); if (num_read == size_to_read) printf ("%i\n" , val); #endif fclose(file); file = NULL ; return 0 ; }
实际上
默认暂时在缓存区中存放内容,比如向磁盘中写入东西,直到缓冲区满时,才会真正开始写入磁盘。也可以中途调用fflush
进行立即刷新缓存区。