学习笔记—C语言基础篇09
来源:互联网 发布:淘宝网账号注册官网 编辑:程序博客网 时间:2024/06/02 21:44
C语言中有三个特殊的文件指针由系统默认打开,用户无需定义即可直接使用:
- stdin: 标准输入,默认为当前终端(键盘),我们使用的scanf、getchar函数默认从此终端获得数据。
- stdout:标准输出,默认为当前终端(屏幕),我们使用的printf、puts函数默认输出信息到此终端。
- stderr:标准出错,默认为当前终端(屏幕),我们使用的perror函数默认输出信息到此终端。
//打开文件://文件指针pf 不能修改文件指针 会导致释放失败#include<stdio.h>FILE* fopen(constchar * filename,const char * mode);功能:打开文件参数: filename:需要打开的文件名,根据需要加上路径 mode:打开文件的模式设置返回值: 成功:文件指针 失败:NULLFILE* pf = fopen(“文件路径”,“模式”); FILE *fp_passwd =NULL; //相对路径: //打开当前目录passdw文件:源文件(源程序)所在目录 FILE *fp_passwd =fopen("passwd.txt","r"); //打开当前目录(test)下passwd.txt文件 fp_passwd =fopen(". / test / passwd.txt","r"); //打开当前目录上一级目录(相对当前目录)passwd.txt文件 fp_passwd =fopen(".. / passwd.txt","r"); //绝对路径: //打开C盘test目录下一个叫passwd.txt文件 fp_passwd =fopen("c://test//passwd.txt","r");
打开模式
含义
r或rb
以只读方式打开一个文本文件(不创建文件,若文件不存在则报错)
w或wb
以写方式打开文件(如果文件存在则清空文件,文件不存在则创建一个文件)
a或ab
以追加方式打开文件,在末尾添加内容,若文件不存在则创建文件
r+或rb+
以可读、可写的方式打开文件(不创建新文件)
w+或wb+
以可读、可写的方式打开文件(如果文件存在则清空文件,文件不存在则创建一个文件)
a+或ab+
以添加方式打开文件,打开文件并在末尾更改文件,若文件不存在则创建文件
注意:
- b是二进制模式的意思,b只是在Windows有效,在Linux用r和rb的结果是一样的
- Unix和Linux下所有的文本文件行都是\n结尾,而Windows所有的文本文件行都是\r\n结尾
- 在Windows平台下,以“文本”方式打开文件,不加b:
- 当读取文件的时候,系统会将所有的 "\r\n" 转换成 "\n"
- 当写入文件的时候,系统会将 "\n" 转换成 "\r\n" 写入
- 以"二进制"方式打开文件,则读\写都不会进行这样的转换
- 在Unix/Linux平台下,“文本”与“二进制”模式没有区别,"\r\n" 作为两个字符原样输入输出
判断文本文件是Linux格式还是Windows格式:
#include<stdio.h>int main(int argc, char **args){ if (argc < 2) return 0; FILE *p = fopen(args[1], "rb"); if (!p) return 0; char a[1024] = { 0 }; fgets(a, sizeof(a), p); int len = 0; while (a[len]) { if (a[len] == '\n') { if (a[len - 1] == '\r') { printf("windows file\n"); } else { printf("linux file\n"); } } len++; } fclose(p); return 0;}
文件打开失败原因:
1、文件不存在
2、文件权限
3、当前程序打开文件过多 (一个程序最多能打开 1024-65534个文件)
4、堆空间内存不足
操作文件 (EOF 代表文件结束)这种以EOF作为文件结束标志的文件,必须是文本文件。
在操作文件时文件中光标会自动后移
EOF != fgetc(pf)
当数据以二进制形式存放到文件中时用feof()函数判断文件结束
#include<stdio.h>intfeof(FILE * stream);功能:检测是否读取到了文件结尾。判断的是最后一次“读操作的内容”,不是当前位置内容(上一个内容)。参数: stream:文件指针返回值: 非0值:已经到文件结尾 0:没有到文件结尾注意:feof函数既可用以判断二进制文件又可用以判断文本文件。
关闭文件:
fclose(“pf”);
简单文件加密操作:位移加密,ASCll加密,密保加密
文件字符读写:fgetc,fputc
#include<stdio.h>intfgetc(FILE * stream);功能:从stream指定的文件中读取一个字符参数: stream:文件指针返回值: 成功:返回读取到的字符 失败:-1#include<stdio.h>intfputc(int ch, FILE * stream);功能:将ch转换为unsigned char后写入stream指定的文件中参数: ch:需要写入文件的字符 stream:文件指针返回值: 成功:成功写入文件的字符 失败:返回-1
文件字符行读写:fgets,fputs
//在行读取操作时 如果字符串长度超过当前行文本内容大小 会读取一行内容
//如果字符串长度小于当前行文本内容大小 会读取字符串最大长度减1的内容
#include<stdio.h>char* fgets(char* str, int size, FILE * stream);功能:从stream指定的文件内读入字符,保存到str所指定的内存空间,直到出现换行字符、读到文件结尾或是已读了size - 1个字符为止,最后会自动加上字符'\0' 作为字符串结束。参数: str:字符串 size:指定最大读取字符串的长度(size - 1) stream:文件指针返回值: 成功:成功读取的字符串 读到文件尾或出错: NULL#include<stdio.h>intfputs(const char * str, FILE * stream);功能:将str所指定的字符串写入到stream指定的文件中,字符串结束符 '\0' 不写入文件。参数: str:字符串 stream:文件指针返回值: 成功:0 失败:-1
格式化读写文件 fprintf,fscanf
#include<stdio.h>intfscanf(FILE * stream, const char * format, ...);功能:从stream指定的文件读取字符串,并根据参数format字符串来转换并格式化数据。参数: stream:已经打开的文件 format:字符串格式,用法和scanf()一样返回值: 成功:参数数目,成功转换的值的个数 失败: - 1#include<stdio.h>intfprintf(FILE* stream, constchar * format, ...);功能:根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中,指定出现字符串结束符'\0' 为止。参数: stream:已经打开的文件 format:字符串格式,用法和printf()一样返回值: 成功:实际写入文件的字符个数 失败:-1
文件块读写 fread fwrite
#include<stdio.h>size_tfread(void *ptr, size_t size, size_t nmemb, FILE *stream);功能:以数据块的方式从文件中读取内容参数: ptr:存放读取出来数据的内存空间 size: size_t 为 unsigned int类型,此参数指定读取文件内容的块数据大小 nmemb:读取文件的块数,读取文件数据总大小为:size * nmemb stream:已经打开的文件指针返回值: 成功:实际成功读取到内容的块数,如果此值比nmemb小,但大于0,说明读到文件的结尾。 失败:0
#include<stdio.h>size_tfwrite(constvoid *ptr, size_t size, size_t nmemb, FILE *stream);功能:以数据块的方式给文件写入内容参数: ptr:准备写入文件数据的地址 size: size_t 为 unsigned int类型,此参数指定写入文件内容的块数据大小 nmemb:写入文件的块数,写入文件数据总大小为:size * nmemb stream:已经打开的文件指针返回值: 成功:实际成功写入文件数据的块数目,此值和nmemb相等 失败:0
获取文件状态信息 stat()函数
#include<sys/types.h>#include<sys/stat.h>intstat(constchar *path,struct stat *buf);功能:获取文件状态信息参数:path:文件名buf:保存文件信息的结构体返回值:成功:0失败-1
structstat {
dev_t st_dev; //文件的设备编号
ino_t st_ino; //节点
mode_t st_mode; //文件的类型和存取的权限
nlink_t st_nlink; //连到该文件的硬连接数目,刚建立的文件值为1
uid_t st_uid; //用户ID
gid_t st_gid; //组ID
dev_t st_rdev; //(设备类型)若此文件为设备文件,则为其设备编号
off_t st_size; //文件字节数(文件大小)
unsignedlongst_blksize; //块大小(文件系统的I/O 缓冲区大小)
unsignedlongst_blocks; //块数
time_t st_atime; //最后一次访问时间
time_t st_mtime; //最后一次修改时间
time_t st_ctime; //最后一次改变时间(指属性)
};
文件中光标操作函数 fseek( )、ftell( )、rewind()
#include<stdio.h>intfseek(FILE *stream, long offset, int whence);功能:移动文件流(文件光标)的读写位置。参数: stream:已经打开的文件指针 offset:根据whence来移动的位移数(偏移量),可以是正数,也可以负数,如果正数,则相对于whence往右移动,如果是负数,则相对于whence往左移动。如果向前移动的字节数超过了文件开头则出错返回,如果向后移动的字节数超过了文件末尾,再次写入时将增大文件尺寸。 whence:其取值如下: SEEK_SET:从文件开头移动offset个字节 SEEK_CUR:从当前位置移动offset个字节 SEEK_END:从文件末尾移动offset个字节返回值: 成功:0 失败:-1#include<stdio.h>longftell(FILE *stream);功能:获取文件流(文件光标)的读写位置。参数: stream:已经打开的文件指针返回值: 成功:当前文件流(文件光标)的读写位置 失败:-1#include<stdio.h>voidrewind(FILE *stream);功能:把文件流(文件光标)的读写位置移动到文件开头。参数: stream:已经打开的文件指针返回值: 无返回值
删除文件 remove、重命名文件名 rename
#include<stdio.h>intremove(constchar*pathname);功能:删除文件参数: pathname:文件名返回值: 成功:0 失败:-1#include<stdio.h>intrename(constchar*oldpath,constchar*newpath);功能:把oldpath的文件名改为newpath参数:oldpath:旧文件名newpath:新文件名返回值:成功:0失败: - 1
更新缓冲区 fflush
#include<stdio.h>intfflush(FILE*stream);功能:更新缓冲区,让缓冲区的数据立马写到文件中。参数:stream:文件指针返回值:成功:0失败:-1
0 0
- 学习笔记—C语言基础篇
- 学习笔记—C语言基础篇09
- 学习笔记之C语言基础篇
- 学习笔记—C语言基础篇02
- 学习笔记—C语言基础篇03
- 学习笔记—C语言基础篇04
- 学习笔记—C语言基础篇05
- 学习笔记—C语言基础篇06
- 学习笔记—C语言基础篇07
- 学习笔记—C语言基础篇08
- C语言基础学习笔记
- Linux C学习笔记——C语言基础
- C语言基础——学习笔记整理3
- C语言基础学习笔记综合
- 宏定义-C语言基础学习笔记
- C语言学习笔记 链表基础
- C语言学习笔记--基础语法一
- C语言学习笔记--基础语法二
- vue 坑
- 反射
- C#树状视图动态加载Menustrip导航菜单
- 纯干货!一根线玩转树莓派ZeroW(图文教程,亲测有效)
- Mybatis从入门到熟悉(1)
- 学习笔记—C语言基础篇09
- Android框架之美Glide3.0
- 安卓开发中很多人都不知道的两个log技巧
- Java Thread(线程)sleep和wait的区别浅析
- java导出excel数据量过大解决方案
- CSS 伪类(a标签) 背景
- SVN创建分支/合并分支/切换分支
- Codeforces Round #413 (Div.1 + Div. 2) B. T-shirt buying
- ubuntu各种代理设置