标准I/O库

2019-06-21  本文已影响0人  suntwo

文件的操作

文件的基本操作通常有读写增加操作,我们使用C语言的标准库来对文件进行操作使用fopen函数进行打开文件,打开文件操作实际上操作系统会为这个文件分配资源,为文件分配文件描述符和I/O缓冲区等资源。使用fclose函数来进行关闭文件,这两个是成对使用的,如果没有关闭文件在进程执行完毕时也会自动关闭文件,但是如果是一个长期运行的进程,如果打开过多的文件,会占用很多的资源,因此这两个函数要成对使用。

fopen函数

#include <stdio.h>

FILE *fopen(const char *path, const char *mode);
返回值:成功返回文件指针,出错返回NULL并设置errno

FILE类型

mode参数的介绍

这个参数传递进来的是一个字符串,传递不同的值有不同的操作。

fclose函数

#include <stdio.h>

int fclose(FILE *fp);
返回值:成功返回0,出错返回EOF并设置errno

表示关闭文件,关闭系统分配给这个文件的资源,关闭后不能再操作这个文件。

stdin/stdout/stderr

这三个其实也是FILE *类型的,在一个终端打开时会自动打开这三个句柄,这三个可以向终端输入数据和输出数据,和文件的读取类似。

errno与perror函数

在libc中定义了errno这个全局变量,使用这个变量表示程序的错误信息,当一个程序出错时便会将errno设置为一个整数,来对应一个错误信息,但是如果只有一个整数是不能看出错误信息的,因此我们可以使用perror或者strerror函数来将错误信息打印出来。

#include <stdio.h>

void perror(const char *s);
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE *fp = fopen("abcde", "r");
    if (fp == NULL) {
        perror("Open file abcde");
        exit(1);
    }
    return 0;
}
结果:
root@ubuntu:/home/sun/project# ./bb
Open file abcde: No such file or directory
#include <string.h>

char *strerror(int errnum);
返回值:错误码errnum所对应的字符串

以字节为单位的读入读出

#include <stdio.h>

int fgetc(FILE *stream);
int getchar(void);
返回值:成功返回读到的字节,出错或者读到文件末尾时返回EOF

#include <stdio.h>

int fputc(int c, FILE *stream);
int putchar(int c);
返回值:成功返回写入的字节,出错返回EOF
#include<stdio.h>
int main(int argc,char *argv[])
{
FILE *p=fopen("bb","r");
FILE *q=fopen("cc","w");
int c;
while((c=fgetc(p))!=EOF)
{
fputc(c,q);
}

fclose(q);
fclose(p);
}

文件的读写位置

我们使用函数来读写位置时,文件的读写位置也在变化,我们接下来介绍几个更改文件读写位置的函数。

#include <stdio.h>

int fseek(FILE *stream, long offset, int whence);
返回值:成功返回0,出错返回-1并设置errno

long ftell(FILE *stream);
返回值:成功返回当前读写位置,出错返回-1并设置errno

void rewind(FILE *stream);
#include<stdio.h>
int main(int argc,char *argv[])
{
FILE *p=fopen("bb","r");
fseek(p,2,SEEK_SET);
printf("%ld",ftell(p));
fclose(p);
}

子字符串为单位的I/O操作

#include <stdio.h>

char *fgets(char *s, int size, FILE *stream);
char *gets(char *s);
返回值:成功时s指向哪返回的指针就指向哪,出错或者读到文件末尾时返回NULL

我们通常使用第一个函数不使用第二个函数,第二个函数比较危险,一般不使用,这个函数的作用是读取文件中的一行到s指向的缓冲区中。

fputs(const char *s,FILE *stream);
#include<stdio.h>
int main()
{

FILE *P=fopen("aaa","r");
char a[5];
fgets(a,5,P);
fputs(a,stdout);
}

这两个函数的总结:fgets函数在读取到表示读取一行文件,在遇到换行符时,会结束读取,表示读取一行结束,fputs函数表示向文件或终端中写入数据,这个函数是以‘\0’,来标志写入结束的。

上一篇 下一篇

猜你喜欢

热点阅读