学习笔记—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