【LINUX文件IO编程】标准IO

目录

前言

fopen

fclose

fgetc

fputc

fgets

fputs

fscanf

fprintf

fread

fwirte

fseek

ftell

rewind


前言

实际上标准IO是调用系统IO的,就比如说在linux系统里面我们使用fopen这个函数,会发现实际上是调用封装在fopen函数里面的open函数。

本篇文章会讲解:fopen fclose fgetc fputc fgets fputs fscanf fprintf fread fwrite fseek ftell rewind函数,这些函数的头文件:stdio.h

fopen

函数的原型:FILE *fopen(const char *path, const char *mode);

功能:打开一个文件

函数的参数:

path:要打开的文件的路径(绝对、相对)

mode:这个简单来说就是,r是读文件,w写文件,a追加文件。r的时候必须要有文件才能读;w的时候是有文件就先把文件清空在写数据,没有文件就是先创建在写数据;a是在文件尾追加数据;可以这样理解,要是w不清空数据直接写那不就没有a的事情了吗;类似r+这里的这个+号,则是可以读写操作;rb这类的b就是以二进制的形式。大家理解一下就应该能记住了。

注:打开绝对路径里面的斜杠要两条-> FILE *pf = fopen("D:\\tmp\\test.c", "r");

函数返回值:

成功返回 文件指针 FILE * 类型的

失败返回 NULL

fclose

函数的原型:int fclose(FILE *stream);

功能:关闭文件描述符

fgetc

函数的原型:int fgetc (FILE *fp);

功能:获取一个字符

eg:


FILE* pf = fopen("text.txt", "r");
int ch = fgetc(pf);//这里fgetc的返回值是int类型的。
printf("%c", ch);

fputc

函数原型:int fputc ( int ch, FILE *fp );

功能:向文件中写一个字符

eg:


FILE* pf = fopen("text.txt", "w");
fputc('a', pf);
fclose(pf);

fgets

函数头文件:stdio.h

函数的原型:char *fgets(char *s, int size, FILE *stream);

函数的参数:

s : 这是指向一个字符数组的指针,该数组存储了要读取的字符串。

size :这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。

stream :这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。

函数返回值:

函数成功:返回读取的首地址。如果到达文件末尾或者没有读取到任何字符,str的内容保持不变,并返回一个空指针。

失败返回NULL

描述:

从指定的流stream读取一行,并把它存储在str所指向的字符串内。当读取(n-1)个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。

eg:


int main() 
{
    FILE* fd = fopen("text.txt", "r+");
    if (fd == NULL)
    {
        printf("open failed!");
        return 0;
    }
    char line[256];
    fgets(line, sizeof(line), fd);/*从fd文件指针中读取字节
    读完这一行(\n)或者255字节(256字节补\0)或者到EOP*/
    printf("%s", line);
    printf("****************************\n");
    fgets(line, sizeof(line), fd);
    printf("%s", line);
    return 1;

}

fputs

函数的功能:往文件输入/写入字符串(写文件 按照行来写,想要换行就要在代码里面加\n)

函数头文件:stdio.h

函数的原型:int fputs(char * str, FILE *stream);

函数的参数:

char *str 就是你要写入的字符串

FILE *stream :就是文件句柄

函数返回值:

该函数返回一个非负值,如果发生错误则返回 EOF。

eg:


int main() 
{
    FILE* fd = fopen("text.txt", "a+");
    if (fd == NULL)
    {
        printf("open failed!");
        return 0;
    }
    char line[256] = "\nApril 19th";
    fputs(line, fd);

    return 1;

}

fscanf

函数的功能:读取格式化输入。

函数头文件:stdio.h

函数的原型:int fscanf(FILE *stream, const char *format, ...)

函数的参数:

FILE *stream :就是文件句柄

函数返回值:

该函数返回一个非负值,如果发生错误则返回 EOF。


int main() 
{
    FILE* fd = fopen("text.txt", "r+");
    if (fd == NULL)
    {
        printf("open failed!");
        return 0;
    }
    char str1[256], str2[256], str3[256], str4[256];
    fscanf(fd, "%s %s %s %s", str1, str2, str3, str4);
    printf("%s %s\n", str1, str2);
    printf("%s %s", str3, str4);
    return 1;

}

fprintf

函数的功能:格式化输出。

函数头文件:stdio.h

函数的原型:int fprintf(FILE *stream, const char *format, ...)

函数的参数:

FILE *stream :就是文件句柄

format : 这是 C 字符串,包含了要被写入到流 stream 中的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。

函数返回值:

该函数返回一个非负值,如果发生错误则返回 EOF。


int main() 
{
    FILE* fd = fopen("text.txt", "w+");
    if (fd == NULL)
    {
        printf("open failed!");
        fclose(fd);
        return 0;
    }
    
    fprintf(fd, "%s %s %s %s", "hello", "world", "april", "19th");
    fprintf(fd, "%s %s %s %s", "hello", "world", "april", "19th");

    fclose(fd);
    return 1;

}

注:需要手动添加\n进行换行。

fread

函数的功能:从文件中读取一片内容

函数头文件:stdio.h

函数的原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

函数的参数:

ptr:传入一个空间

size:这是要读取的每个元素的大小,以字节为单位。

nmemb: 这是元素的个数,每个元素的大小为 size 字节。

stream:文件句柄

函数返回值:

size_t :读取的次数


int main() 
{
    FILE* fd = fopen("text.txt", "r+");
    if (fd == NULL)
    {
        printf("open failed!");
        fclose(fd);
        return 0;
    }
    char buff[20] = "";
    fread(buff, sizeof(buff), 1, fd);
    printf("%s", buff);

    fclose(fd);
    return 1;

}

fwirte

函数的功能:写入一个缓冲区给文件

函数头文件:stdio.h

函数的原型:

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

函数的参数:

ptr: 这是指向要被写入的元素数组的指针。

size:这是要被写入的每个元素的大小,以字节为单位。

nmemb:这是元素的个数,每个元素的大小为 size 字节。

stream:这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。

函数返回值:

返回你成功写入的次数


int main() 
{
    FILE* fd = fopen("text.txt", "w+");
    if (fd == NULL)
    {
        printf("open failed!");
        fclose(fd);
        return 0;
    }
    char buff[20] = "i eat apple";
    fwrite(buff, sizeof(buff), 1, fd);
    

    fclose(fd);
    return 1;

}

fseek

函数头文件:stdio.h

函数功能:设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。

函数的原型:int fseek(FILE * stream,long offset,int whence);

函数的参数:

stream:文件句柄

offset:为根据参数 whence 来移动读写位置的位移数(负数就是向前移,整数就是向后移)

whence:

SEEK_SET: 从距文件开头offset位移量为新的读写位置

SEEK_CUR: 以目前的读写位置往后增加offset个位移量

SEEK_END :将读写位置指向文件尾后再增加offset个位移量

函数返回值:

调用成功时则返回 0

若有错误则返回-1

注意:

1.必须使用 ftell()来取得目前读写的位置。

2.当 whence 值为 SEEK_CUR 或 SEEK_END 时,参数 offset 允许负值的出现


int main() 
{
    FILE* fd = fopen("text.txt", "w+");
    if (fd == NULL)
    {
        printf("open failed!");
        fclose(fd);
        return 0;
    }
    char buff[20] = "i like eat apple";
    fwrite(buff, strlen(buff), 1, fd);//这里应该打印i like eat apple
    
    fseek(fd, -5, SEEK_CUR);//这里的意思是,当前文件指针的位置向前移五个字节。
    fwrite("banana", strlen("banana"), 1, fd);

    fclose(fd);
    return 1;

}

ftell

函数功能:查找当前文件指针的位置

函数原型:long int ftell(FILE *stream);

返回值:该函数返回位置标识符的当前值。如果发生错误,则返回 -1L,全局变量 errno 被设置为一个正值。


int main() 
{
    FILE* fd = fopen("text.txt", "w+");
    if (fd == NULL)
    {
        printf("open failed!");
        fclose(fd);
        return 0;
    }
    char buff[20] = "i like eat apple";
    fwrite(buff, strlen(buff), 1, fd);
    
    fseek(fd, -5, SEEK_CUR);
    int num = strlen("i like eat ");//我们预期让文件指针移动到的位置,有空格!
    int addr = ftell(fd);//计算此时文件指针的位置
    printf("now addr is %d, num is %d\n", addr, num);
    fwrite("banana", strlen("banana"), 1, fd);


    fclose(fd);
    return 1;

}

rewind

函数功能:让文件指针的位置回到起始位置

函数原型:void rewind(FILE *stream);


int main() 
{
    FILE* fd = fopen("text.txt", "w+");
    if (fd == NULL)
    {
        printf("open failed!");
        fclose(fd);
        return 0;
    }
    char buff[20] = "i like eat apple";
    fwrite(buff, strlen(buff), 1, fd);
    
    fseek(fd, -5, SEEK_CUR);
    rewind(fd);
    fwrite("banana", strlen("banana"), 1, fd);

    fclose(fd);
    return 1;
}

完结!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

April.19th

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值