C基础学习笔记——01-C基础第13天(文件下)

在学习C基础总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。

01-C基础第13天(文件下)

目录:

(1)按照块读写文件fread、fwrite
1)写文件
2)读文件
3)强化训练:大文件拷贝
(2)文件的随机读写
(3)Windows和Linux文本文件区别
练习:判断windows文件还是linux文件
 (4)获取文件状态
(5)删除文件、重命名文件名
 (6)文件缓冲区
1)文件缓冲区
2)磁盘文件的存取
3)更新缓冲区

 

(1)按照块读写文件fread、fwrite

1)写文件

 1 #include <stdio.h>
 2 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
 3 功能:以数据块的方式给文件写入内容
 4 参数:
 5     ptr:准备写入文件数据的地址
 6     size: size_t 为 unsigned int类型,此参数指定写入文件内容的块数据大小
 7     nmemb:写入文件的块数,写入文件数据总大小为:size * nmemb
 8     stream:已经打开的文件指针
 9 返回值:
10     成功:实际成功写入文件数据的块数目,此值和nmemb相等
11     失败:0

2)读文件

 1 #include <stdio.h>
 2 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
 3 功能:以数据块的方式从文件中读取内容
 4 参数:
 5     ptr:存放读取出来数据的内存空间
 6     size: size_t 为 unsigned int类型,此参数指定读取文件内容的块数据大小
 7     nmemb:读取文件的块数,读取文件数据总大小为:size * nmemb
 8     stream:已经打开的文件指针
 9 返回值:
10     成功:实际成功读取到内容的块数,如果此值比nmemb小,但大于0,说明读到文件的结尾。
11     失败:0

3)强化训练:大文件拷贝

(2)文件的随机读写

 1 #include <stdio.h>
 2 int fseek(FILE *stream, long offset, int whence);
 3 功能:移动文件流(文件光标)的读写位置。
 4 参数:
 5     stream:已经打开的文件指针
 6     offset:根据whence来移动的位移数(偏移量),可以是正数,也可以负数,如果正数,则相对于whence往右移动,如果是负数,则相对于whence往左移动。如果向前移动的字节数超过了文件开头则出错返回,如果向后移动的字节数超过了文件末尾,再次写入时将增大文件尺寸。
 7     whence:其取值如下:
 8         SEEK_SET:从文件开头移动offset个字节
 9         SEEK_CUR:从当前位置移动offset个字节
10         SEEK_END:从文件末尾移动offset个字节
11 返回值:
12     成功:0
13     失败:-1
14 
15 #include <stdio.h>
16 long ftell(FILE *stream);
17 功能:获取文件流(文件光标)的读写位置。
18 参数:
19     stream:已经打开的文件指针
20 返回值:
21     成功:当前文件流(文件光标)的读写位置
22     失败:-1
23 
24 #include <stdio.h>
25 void rewind(FILE *stream);
26 功能:把文件流(文件光标)的读写位置移动到文件开头。
27 参数:
28     stream:已经打开的文件指针
29 返回值:
30     无返回值

(3)Windows和Linux文本文件区别

1)b是二进制模式的意思,b只是在Windows有效,在Linux用r和rb的结果是一样的

 2)Unix和Linux下所有的文本文件行都是\n结尾,而Windows所有的文本文件行都是\r\n结尾

 3)在Windows平台下,以“文本”方式打开文件,不加b:
  当读取文件的时候,系统会将所有的 "\r\n" 转换成 "\n"
  当写入文件的时候,系统会将 "\n" 转换成 "\r\n" 写入
  以"二进制"方式打开文件,则读\写都不会进行这样的转换

 4)在Unix/Linux平台下,“文本”与“二进制”模式没有区别,"\r\n" 作为两个字符原样输入输出

练习:判断windows文件还是linux文件

 1 #include<stdio.h>
 2 
 3 int main(int argc, char **args)
 4 {
 5     if (argc < 2)
 6         return 0;
 7 
 8     FILE *p = fopen(args[1], "rb");
 9     if (!p)
10         return 0;
11 
12     char a[1024] = { 0 };
13     fgets(a, sizeof(a), p);
14 
15     int len = 0;
16     while (a[len])
17     {
18         if (a[len] == '\n')
19         {
20             if (a[len - 1] == '\r')
21             {
22                 printf("windows file\n");
23             }
24             else
25             {
26                 printf("linux file\n");
27             }
28         }
29         len++;
30     }
31 
32     fclose(p);
33 
34     return 0;
35 }

 (4)获取文件状态

 1 #include <sys/types.h>
 2 #include <sys/stat.h>
 3 int stat(const char *path, struct stat *buf);
 4 功能:获取文件状态信息
 5 参数:
 6 path:文件名
 7 buf:保存文件信息的结构体
 8 返回值:
 9 成功:0
10 失败-1

(5)删除文件、重命名文件名

 1 #include <stdio.h>
 2 int remove(const char *pathname);
 3 功能:删除文件
 4 参数:
 5     pathname:文件名
 6 返回值:
 7     成功:0
 8     失败:-1
 9 
10 #include <stdio.h>
11 int rename(const char *oldpath, const char *newpath);
12 功能:把oldpath的文件名改为newpath
13 参数:
14 oldpath:旧文件名
15 newpath:新文件名
16 返回值:
17 成功:0
18 失败: - 1

 (6)文件缓冲区

1)文件缓冲区

 ANSI C标准采用“缓冲文件系统”处理数据文件。

所谓缓冲文件系统是指系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去。

如果从磁盘向计算机读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量) 。

2)磁盘文件的存取

 

1)磁盘文件,一般保存在硬盘、U盘等掉电不丢失的磁盘设备中,在需要时调入内存

2)在内存中对文件进行编辑处理后,保存到磁盘中

3)程序与磁盘之间交互,不是立即完成,系统或程序可根据需要设置缓冲区,以提高存取效率

3)更新缓冲区

1 #include <stdio.h>
2 int fflush(FILE *stream);
3 功能:更新缓冲区,让缓冲区的数据立马写到文件中。
4 参数:
5 stream:文件指针
6 返回值:
7 成功:0
8 失败:-1

 

 

 

在学习C基础总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。

posted on 2020-06-03 15:30  Alliswell_WP  阅读(258)  评论(0编辑  收藏  举报

导航