学习笔记—C语言基础篇09

C语言中有三个特殊的文件指针由系统默认打开,用户无需定义即可直接使用:
  • stdin: 标准输入,默认为当前终端(键盘),我们使用的scanf、getchar函数默认从此终端获得数据。
  • stdout:标准输出,默认为当前终端(屏幕),我们使用的printf、puts函数默认输出信息到此终端。
  • stderr:标准出错,默认为当前终端(屏幕),我们使用的 perror函数默认输出信息到此终端。
//打开文件:
//文件指针pf 不能修改文件指针 会导致释放失败
#include
FILE* fopen(constchar * filename,const char * mode);
功能:打开文件
参数:
       filename:需要打开的文件名,根据需要加上路径
       mode:打开文件的模式设置
返回值:
       成功:文件指针
       失败:NULL

FILE* 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
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
intfeof(FILE * stream);
功能:检测是否读取到了文件结尾。判断的是最后一次“读操作的内容”,不是当前位置内容(上一个内容)。
参数:
       stream:文件指针
返回值:
       非0值:已经到文件结尾
       0:没有到文件结尾
注意:feof函数既可用以判断二进制文件又可用以判断文本文件。
关闭文件:
fclose(“pf”);

简单文件加密操作:位移加密,ASCll加密,密保加密

文件字符读写:fgetc,fputc
#include
intfgetc(FILE * stream);
功能:从stream指定的文件中读取一个字符
参数:
       stream:文件指针
返回值:
       成功:返回读取到的字符
       失败:-1
#include
intfputc(int ch, FILE * stream);
功能:将ch转换为unsigned char后写入stream指定的文件中
参数:
       ch:需要写入文件的字符
       stream:文件指针
返回值:
       成功:成功写入文件的字符
       失败:返回-1
文件字符行读写:fgets,fputs
//在行读取操作时  如果字符串长度超过当前行文本内容大小   会读取一行内容
//如果字符串长度小于当前行文本内容大小 会读取字符串最大长度减1的内容
#include
char* fgets(char* str, int size, FILE * stream);
功能:从stream指定的文件内读入字符,保存到str所指定的内存空间,直到出现换行字符、读到文件结尾或是已读了size - 1个字符为止,最后会自动加上字符'\0' 作为字符串结束。
参数:
       str:字符串
       size:指定最大读取字符串的长度(size - 1)
       stream:文件指针
返回值:
       成功:成功读取的字符串
       读到文件尾或出错: NULL
#include
intfputs(const char * str, FILE * stream);
功能:将str所指定的字符串写入到stream指定的文件中,字符串结束符 '\0'  不写入文件。
参数:
       str:字符串
       stream:文件指针
返回值:
       成功:0
       失败:-1
格式化读写文件 fprintf,fscanf
#include
intfscanf(FILE * stream, const char * format, ...);
功能:从stream指定的文件读取字符串,并根据参数format字符串来转换并格式化数据。
参数:
       stream:已经打开的文件
       format:字符串格式,用法和scanf()一样
返回值:
       成功:参数数目,成功转换的值的个数
       失败: - 1
#include
intfprintf(FILE* stream, constchar * format, ...);
功能:根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中,指定出现字符串结束符'\0'  为止。
参数:
       stream:已经打开的文件
       format:字符串格式,用法和printf()一样
返回值:
       成功:实际写入文件的字符个数
       失败:-1
文件块读写   fread fwrite
#include
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
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
#include
intstat(constchar *path,struct stat *buf);
功能:获取文件状态信息
参数:
path:文件名
buf:保存文件信息的结构体
返回值:
成功:0
失败-1
struct stat {
        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;        //文件字节数(文件大小)
        unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)
        unsigned long st_blocks;    //块数
        time_t        st_atime;     //最后一次访问时间
        time_t        st_mtime;    //最后一次修改时间
        time_t        st_ctime;     //最后一次改变时间(指属性)
};
文件中光标操作函数 fseek( )、ftell( )、rewind()
#include
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
longftell(FILE *stream);
功能:获取文件流(文件光标)的读写位置。
参数:
       stream:已经打开的文件指针
返回值:
       成功:当前文件流(文件光标)的读写位置
       失败:-1


#include
voidrewind(FILE *stream);
功能:把文件流(文件光标)的读写位置移动到文件开头。
参数:
       stream:已经打开的文件指针
返回值:
       无返回值
删除文件 remove、重命名文件名 rename
#include
intremove(constchar*pathname);
功能:删除文件
参数:
       pathname:文件名
返回值:
       成功:0
       失败:-1
#include
intrename(constchar*oldpath,constchar*newpath);
功能:把oldpath的文件名改为newpath
参数:
oldpath:旧文件名
newpath:新文件名
返回值:
成功:0
失败: - 1
更新缓冲区 fflush
#include
intfflush(FILE*stream);
功能:更新缓冲区,让缓冲区的数据立马写到文件中。
参数:
stream:文件指针
返回值:
成功:0
失败:-1

你可能感兴趣的:(C语言简单基础笔记)