C语言基础---文件操作

版权声明:本文为小斑马伟原创文章,转载请注明出处!
一、文件api的分类

01)文件读写api
    fgetc fputc     按照字符读写文件
    fputs fgets     按照行读写文件 (读写配置文件)
    fread fwirte    按照块读写文件 (大数据块迁移)
    fprintf         按照格式化进行读写文件
                fprintf(fp, "%s = %s\n", pKey, pValue);

02)文件控制api  
    文件是否结束
    文件指针的定位、跳转
    fseek(fp, 0L, SEEK_END); //把文件指针从0位置开始,移动到文件末尾
    //获取文件长度;
    length = ftell(fp);

    fseek(fp, 0L, SEEK_SET);
03)api做项目

二、标准文件的读写
1.文件的打开fopen()
文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了。当使用打开函数时,必须给出文件名、文件操作方式(读、写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错),并将文件指针指向文件开头。若已有一个同名文件存在,则删除该文件,若无同名文件,则建立该文件,并将文件指针指向文件开头。
fopen(char filename,char type);
其中
filename是要打开文件的文件名指针,一般用双引号括起来的文件名表示,也可使用双反斜杠隔开的路径名。而
type参数表示了对打开文件的操作方式。其可采用的操作方式如下:
方式 含义
"r" 打开,只读
"w" 打开,文件指针指到头,只写
"a" 打开,指向文件尾,在已存在文件中追加
"rb" 打开一个二进制文件,只读
"wb" 打开一个二进制文件,只写
"ab" 打开一个二进制文件,进行追加
"r+" 以读/写方式打开一个已存在的文件
"w+" 以读/写方式建立一个新的文本文件
"a+" 以读/写方式打开一个文件文件进行追加
"rb+" 以读/写方式打开一个二进制文件
"wb+" 以读/写方式建立一个新的二进制文件
"ab+" 以读/写方式打开一个二进制文件进行追加
当用fopen(0成功的打开一个文件时,该函数将返回一个FILE指针,如果文件打开失败,将返回一个NULL指针。如想打开test文件,进行写:

FILE *fp;
if((fp=fopen("test","w"))==NULL)
{
    printf("File cannot be    opened\n");
    exit();
} else {
    printf("File opened for writing\n");
      ……
    fclose(fp);
}

2.关闭文件函数fclose()
文件操作完成后,必须要用fclose()函数进行关闭,这是因为对打开的文件进行写入时,若文件缓冲区的空间未被写入的内容填满,这些内容不会写到打开的文件中去而丢失。只有对打开的文件进行关闭操作时,停留在文件缓冲区的内容才能写到该文件中去,从而使文件完整。再者一旦关闭了文件,该文件对应的FILE结构将被释放,从而使关闭的文件得到保护,因为这时对该文件的存取操作将不会进行。文件的关闭也意味着释放了该文件的缓冲区。
int fclose(FILE *stream);
它表示该函数将关闭FILE指针对应的文件,并返回一个整数值。若成功地关闭了文件,则返回一个0值,否则返回一个非0值。常用以下方法进行测试:

if(fclose(fp)!=0)
{
    printf("File cannot be closed\n");
    exit(1);
}   else {
 printf("File is now closed\n");
}

当打开多个文件进行操作,而又要同时关闭时,可采用fcloseall()函数,它将关闭所有在程序中打开的文件。
int fcloseall();
该函数将关闭所有已打开的文件,将各文件缓冲区未装满的内容写到相应的文件中去,接着释放这些缓冲区,并返回关闭文件的数目。如关闭了4个文件,则当执行:n=fcloseall(); 时,n应为4。
3.按照字符读文件
include
int fgetc(FILE* stream);
功能:从stream指定的文件中读取一个字符
参数:stream:文件指针
返回值:成功:返回读取到字符 失败:-1

FILE* fp = fopen("D://a.txt", "r");
if (fp == NULL) {
    printf("打开文件失败\n");
    return -1;
}
printf("文件打开成功:%p\n", fp);
char ch;
while ((ch = fgetc(fp)) != EOF) {
    printf("%c", ch);
}
fclose(fp);

文件结尾:在C语言中,EOF表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的行驶存放。
3.按照字符写文件
int fputc(int ch,FILE* stream);
功能:讲ch转换为unsigned char 后写入stream指定的文件中
参数:ch:需要写入文件的字符 stream:文件指针
返回值:成功:成功写入文件的字符 失败:返回-1
feof函数,用来判断文件是否结束。feof函数既可用以判断二进制文件又可用判断文本文件。
int feof(FILE *stream)
功能:检测是否读取到了文件结尾。判断的是最后一次”读操作的内容"不是当前位置内容(上一个内容)
参数:stream:文件指针
返回值:非0值:已经到文件结尾 0:没有到文件结尾

FILE* fp = fopen("D:/a.txt", "w");

if (!fp) {
    printf("文件打开失败\n");
    return -1;
}

char ch;
while(1){
    scanf("%c", &ch);
    if (cj == '@') {
        break;
    }
    fputc(ch, fp);
}

fclose(fp);

4.文件加密和解密

 int main(void) {
FILE* fp1 = fopen("D://解密.txt", "r");
FILE* fp2 = fopen("D://加密.txt", "w");
if (!fp1 || !fp2) {
    return -1;
}

char ch;
while ((ch = fgetc(ch, fp1)) != EOF) {
    ch++;
    //加密
    fputc(ch, fp2);
}
fclose(fp2);
fclose(fp1);

system("pause");
return 0;
}

int main(void) {
FILE* fp1 = fopen("D://解密.txt", "r");
FILE* fp2 = fopen("D://加密.txt", "w");
if (!fp1 || !fp2) {
    return -1;
}

char ch;
while ((ch = fgetc(ch, fp1)) != EOF) {
    ch--;
    //解密
    fputc(ch, fp2);
}
fclose(fp2);
fclose(fp1);

system("pause");
return 0;
}

5.文件行读操作
功能:从stream指定的文件内读入字符,保存到str所指定的内存空间,直到出换行字符、读到文件结尾或是已读了size-1个字符为止,最后会自动加上'\0'作为字符串结束。
参数:str:字符串 size:指定最大读取字符串的长度(size-1) stream:文件指针
返回值:成功:成功读取的字符串 读到文件尾或出错:NULL
fgets()在读取一个用户通过键盘输入的字符串的时候,同时把用户输入的回车也作为字符串的一部分。通过scanf和gets输入一个字符串的时候,不包含结尾的"\n",但通过fgets结尾多了"\n"。fgets()函数是安全的,不存在缓冲区溢出的问题。

FILE* fp = fopen("D://a.txt", "r");

if (!fp)
    return -1;
char* p = (char*)malloc(sizeof(char)* 100);

//feof(文件指针) 判断文件是否到结尾 可以判断文本文件也可以判断二进制文件
//如果到文件结尾返回值为  非0的值
//如果没有到文件结尾返回值为 0
while (!feof(fp)) {
    memset(p, 0, 100);
    fgets(p, 100, fp);

    printf("%s\n", p);
}

free(p);
fclose(fp);

5.文件行写操作
功能:将str所指定的字符串写入到stream指定的文件中,字符结束符'\0'不写入文件。
参数:str 字符串 stream 文件指针,如果把字符串输出到屏幕,固定写为stdout
返回值:成功 0 失败 -1
fputs()是puts()的文件操作版本,但fputs()不会自动输出一个'\n'

FILE* fp = fopen("D:/d.txt", "w");
if (!fp)
    return -1;

char ch[] = "你哈哈哈";
fputs(ch, fp);

fclose(fp);
system("pause");

键盘输入 写入文件中

FILE* fp = fopen("D://B.txt", "w");
if (!fp)
    return -1;
char* p = (char*)malloc(sizeof(char)* 1024);

while (1) {
    memset(p, 0, 1024);
    //fgets()
    scanf("%[^\n]", p);
    //吞噬回车\n
    getchar();
    //停止输入命令 comm = exit
    if (!strcmp(p, "comm=exit"))
        break;
    //追加\n
    strcat(p, "\n");
    fputs(p, fp);
}
free(p);
fclose(fp);

6.四则运算文件行写操作

enum opt {
   add,sub,mlt,dive
}op;

int main() {

srand((size_t)time(NULL));
FILE* fp = fopen("D://四则运算.txt", "w");
if (!fp) {
    return -1;
}

int a, b;
char c;//+ - * /
char* p = (char*)malloc(sizeof(char)* 20);
for (int i = 0; i < 100; i++) {
    a = rand() % 10 + 1;
    b = rand() % 10 + 1;

    switch (rand()%4)
    {
    case add: c = '+';
        break;
    case sub: c = '-';
        break;
    case mlt: c = '*';
        break;
    case dive: c = '/';
        break;
    default:
        break;
    }
    memset(p, 0, 20);
    printf(p, "%d%c%d=\n", a, c, b);
    fputs(p, fp);
}

free(p);
fclose(fp);

system("pause");
return 1;

}

6.四则运算文件行读操作

FILE* fp1 = fopen("D:/四则运算.txt", "r");
FILE* fp2 = fopen("D:/四则运算结果.txt", "w");
if (!fp1 || !fp2) {
    printf("打开文件失败\n");
    return -1;
}
int a,b,sum;
char c;
char* p = (char*)malloc(sizeof(char)*20);
for (int i = 0; i < 100; i++) {
    memset(p, 0, 20);
    fgets(p,20,fp1);

    sscanf(p, "%d%c%d=\n", &a, &c, &b);
    switch (c) {
    case '+':sum = a + b; break;
    case '-':sum = a - b; break;
    case '*':sum = a * b; break;
    case '/':sum = a / b; break;
    }
    memset(p, 0, 20);
    sprintf(p, "%d%c%d = %d\n", a, c, b, sum);
    fputs(p, fp2);
}

free(p);
fclose(fp1);
fclose(fp2);

return 0;

你可能感兴趣的:(C语言基础---文件操作)