标准IO相关函数

一: – fgets( )

#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
功能:从文件中读取内容
参数:    
	s:保存读取到的内容    
	size:每次读取的最大个数    
	stream:文件指针
返回值:    
	成功:读取的数据的首地址   
	失败:NULL   如果文件内容读取完毕,也返回NULL

案例:

#include <stdio.h>#include <string.h>
int main(int argc, char const *argv[]){    
//使用fgets从终端读取数据#if 0    
//注意事项:    
//  如果输入的字符串的长度小于fgets的第二个参数,则会将换行符也当做一个字符保存在第一个参数里面    
//char buf[32] = {0};    
//fgets(buf, sizeof(buf), stdin); //"hello world\n"    
//处理由fgets从终端获取字符串中的\n    
//buf[strlen(buf) - 1] = '\0';
    //  如果输入的字符串的长度大于fgets的第二个参数,则只能读取到第二个参数-1个字符,最后一个位置自动补\0    
    //char buf[32] = {0};    //fgets(buf, 5, stdin);
    //  如果保存fgets读取数据的字符串不够大,则会出现内存溢出的错误,所以保证第一个参数足够大    
    char buf[5] = {0};    
    fgets(buf, 10, stdin);    
    printf("buf = %s\n", buf);#endif
    if(argc < 2)    
    {        
    fprintf(stderr, "Usage: %s filename\n", argv[0]);       
    return -1;    
    }
    //使用fgets从文件中读取数据    
    FILE *fp;    
    if((fp = fopen(argv[1], "r")) == NULL)    
    {        
    perror("fail to fopen");        
    return -1;    
    }
    //注意:如果fgets从文件中读取内容    
    //     1、不管一次读多少个字节,只要遇到每一行的行结束符\n,就会立即结束读取    
    //     2、如果fgets的第二个参数小于一行的内容,只会读取fgets的第二个参数-1个字符,最后一个位置补\0
    #if 0    
    char buf[32] = {};    
    fgets(buf, 8, fp);    
    printf("[%s]\n", buf);
    fgets(buf, 8, fp);    
    printf("[%s]\n", buf);
    #endif
    char buf[32] = {0};    
    while(fgets(buf, sizeof(buf), fp) != NULL)    
    {        
    printf("%s", buf);    
    }
    return 0;
    }

二:-- fputs( )

#include <stdio.h>
int fputs(const char *s, FILE *stream);
功能:向文件写入数据
参数:    
	s:要写入的内容    
	stream:文件指针
返回值:    
	成功:写入文件内容的字节数    
	失败:EOF

案例:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char const *argv[]){
    //使用fputs向终端写入数据    
    //fputs("hello world", stdout);    
    //fflush(stdout);    
    //sleep(10);
    //使用fputs向文件写入数据    
    FILE *fp;    
    if((fp = fopen("file.txt", "w+")) == NULL)    
    {        
    perror("fail to fopen");        
    return -1;    
    }
    fputs("hello world\n", fp);    
    fputs("nihao beijing\n", fp);
    //由于fputs写入内容后改变了文件的偏移量,所以此时文件的偏移量在最后一个字节的下一个位置   
    //所以读取数据是什么也读取不到    
    // char buf[32] = {0};    
    // fgets(buf, 32, fp);    
    // printf("buf = %s\n", buf);
    return 0;}

三:-- fread( )

#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从文件中读取数据
参数:    
	ptr:保存读取的数据    
	size:每次读取的字节数    
	nmemb:一共读取的次数    
	stream:文件指针
返回值:    
	成功:实际读取的次数(对象数、块数)    
	失败:0    如果文件内容读取完毕,返回0

案例:

#include <stdio.h>
typedef struct{    
int a;    
int b;    
char c;    
char d[32];}MSG;
int main(int argc, char const *argv[]){    
//使用fread从文件中读取数据    
FILE *fp;    
if((fp = fopen("file.txt", "r")) == NULL)    
{        
perror("fail to fopen");        
return -1;    }
    // char buf[32] = {0};    
    // fread(buf, 2, 5, fp);    
    // printf("buf = %s\n", buf);        
    // int num;    
    // fread(&num, 4, 1, fp);    
    // printf("num = %d\n", num);
    // int b[4] = {0};    
    // fread(b, 4, 4, fp);    
    // printf("%d %d %d %d\n", b[0], b[1], b[2], b[3]);        
    MSG msg;    
    fread(&msg, sizeof(msg), 1, fp);    
    printf("%d - %d - %c - %s\n", msg.a, msg.b, msg.c, msg.d);        
    return 0;
    }

四:-- fwrite( )

#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:向文件中写入数据
参数:    
	ptr:要写入的数据    
	size:一次写入的字节数    
	nmemb:一共写入的次数    
	stream:文件指针
返回值:    
	成功:实际写入的次数    
	失败:0

案例

#include <stdio.h>
typedef struct{    
int a;    
int b;    
char c;    
char d[32];}MSG;
int main(int argc, char const *argv[])
{    
//使用fwrite向文件写入数据    
FILE *fp;    
if((fp = fopen("file.txt", "w")) == NULL)    
{        
perror("fail to fopen");        
return -1;    
}
    //写入字符串    
    //char buf[] = "1234567890";    
    //fwrite(buf, 2, 5, fp);        
    //写入整数    
    //int a = 97868;    
    //fwrite(&a, 4, 1, fp);
    //写入数组    
    //int a[4] = {100, 200, 300, 400};    
    //fwrite(a, 4, 4, fp);
    //写入结构体    
    MSG msg = {666, 888, 'w', "zhangsan"};    
    fwrite(&msg, sizeof(msg), 1, fp);
    return 0;
    }

五:-- ftell( )

#include <stdio.h>
long ftell(FILE *stream);
功能:获取当前文件的偏移量
参数:    
	stream:文件指针
返回值:    
	获取当前文件的偏移量

六:-- fseek()

#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
功能:设置文件位置指针的偏移量
参数:    
	stream:文件指针    
	offset:偏移量        可正可负也可为0    
	whence:相对位置        SEEK_SET 文件起始位置       SEEK_CUR 文件当前位置      SEEK_END 文件末尾位置(最后一个字符后面一个位置)
返回值:    
	成功:0    
	失败:-1

七:-- rewind( )

#include <stdio.h>
void rewind(FILE *stream);
功能:将文件位置定位到起始位置
参数:    
	stream:文件指针
返回值:无
	rewind(fp) <==> fseek(fp, 0, SEEK_SET);

案例:

#include <stdio.h>
int main(int argc, char const *argv[]){    
//写操作的文件偏移量#if 0    
FILE *fp;    
if((fp = fopen("file.txt", "w")) == NULL)    
{        
perror("fail to fopen");        
return -1;    
}
    fputs("abcdefghijklmnopq", fp);    
    //使用ftell获取文件偏移量    
    printf("offset = %ld\n", ftell(fp));
    //使用fseek修改文件偏移量   
    //rewind(fp);    
    //fseek(fp, 0, SEEK_SET);        
    fseek(fp, -5, SEEK_END);    
    fputs("12345", fp);#endif
#if 0    
FILE *fp;    
if((fp = fopen("file.txt", "r")) == NULL)    
{        
perror("fail to fopen");        
return -1;    
}
    char buf[32] = {0};   
    fgets(buf, 6, fp);    
    printf("buf = %s\n", buf);
    printf("offset = %ld\n", ftell(fp));   
    fseek(fp, 3, SEEK_SET);    
    printf("offset = %ld\n", ftell(fp));
    fgets(buf, 6, fp);    
    printf("buf = %s\n", buf);
    #endif
    FILE *fp;    
    //如果fopen打开或者创建一个文件时使用的是的a或者a+权限    
    //则写操作的偏移量无法改变,只能在文件的末尾位置    
    //但是读操作没有任何影响    
    if((fp = fopen("file.txt", "a+")) == NULL)    
    {        
    perror("fail to fopen");        
    return -1;    
    }
    // char buf[32] = {0};    
    // fgets(buf, 6, fp);    
    // printf("buf = %s\n", buf);
    // printf("offset = %ld\n", ftell(fp));    
    // fseek(fp, 3, SEEK_SET);    
    // printf("offset = %ld\n", ftell(fp));
    // fgets(buf, 6, fp);    
    // printf("buf = %s\n", buf);
    fputs("888888888", fp);    
    printf("offset = %ld\n", ftell(fp));    
    fseek(fp, 3, SEEK_SET);    
    printf("offset = %ld\n", ftell(fp));        
    fputs("666666", fp);
    return 0;}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

路漫漫其远,吾求索

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

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

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

打赏作者

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

抵扣说明:

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

余额充值