Linux学习——标准IO的读写

 

目录

一、字符的输入(读单个字符)

注意事项:

二、字符的输出(写单个字符)

注意事项:

三、行输入(读取整个行)

 四、行输出(输出整行)

 五、二进制读写

文本文件和二进制的区别:

二进制读写函数格式:

注意事项:


一、字符的输入(读单个字符)

int  fgetc(FILE *stream);   //函数

 int  getc(FILE *stream);   //宏

 int  getchar(void);   //只能读取标准输入

成功时返回读取的字符;若到文件末尾或出错时返回EOF(-1),

getchar()等同于fgetc(stdin)

注意事项:

1函数返回值是int类型不是char类型,主要是为了扩展返回值的范围。

2 tdin 也是FILE *的指针,是系统定义好的,指向的是标准输入(键盘输入)

3 打开文件后读取,是从文件开头开始读。读完一个后读写指针会后移。读写注意文件位置!

4 调用getchar会阻塞,等待你的键盘输入

实验程序:

#include <stdio.h>


int main()
{
	FILE *fp;
	fp = fopen("1.txt","r");
	if(fp == NULL)
	{
		perror("fopen");
		return 0;
	}
	printf("getc = %c\n",fgetc(fp));
	fclose(fp);
	fp = fopen("1.txt","r");
	if(fp == NULL)
	{
		perror("fopen");
		return 0;
	}
	for(int i = 0;i < 4;i++)
	{
		printf("getc[%d] = %c\n",i,fgetc(fp));
			
	}
	fclose(fp);
	printf("getchar = %c\n",getchar());
	
}

实验结果: 

 

二、字符的输出(写单个字符)

int  fputc(int c, FILE *stream);

int  putc(int c, FILE *stream);

int  putchar(int c);

成功时返回写入的字符;出错时返回EOF(-1)

putchar(c)等同于fputc(c, stdout)

注意事项:

1返回和输入参数都是int类型

2遇到这种错误:Bad file descriptor,  很可能是文件打开的模式错误(只读模式去写,只写模式去读)

实验程序:

#include <stdio.h>


int main()
{
	FILE *fp;
	fp = fopen("1.txt","r");
	if(fp == NULL)
	{
		perror("fopen");
		return 0;
	}
	printf("getc = %c\n",fgetc(fp));
	fclose(fp);
	fp = fopen("1.txt","r");
	if(fp == NULL)
	{
		perror("fopen");
		return 0;
	}
	for(int i = 0;i < 4;i++)
	{
		printf("getc[%d] = %c\n",i,fgetc(fp));
			
	}
	fclose(fp);
	printf("getchar = %c\n",getchar());
	

	fp = fopen("1.txt","r+");
	if(fp == NULL)
	{
		perror("fopen");
		return 0;
	}
	int rec = 'w';
	if(fputc(rec,fp) == -1)
	{
		perror("fputc");
		fclose(fp);
		return 0;
	}
	for(int i = 0;i < 4;i++)
	{
		printf("getc[%d] = %c\n",i,fgetc(fp));
			
	}
	fclose(fp);
	return 0;
}

结果:

  

第一个a被写成了w,但是再次输出却是从b开始的, putchar就是直接输出到屏幕上,不多解释了。

三、行输入(读取整个行)

char  *gets(char *s);  读取标准输入到缓冲区s

char *fgets(char *s, int size, FILE *stream);

成功时返回s,到文件末尾或出错时返回NULL

遇到’\n’或已输入size-1个字符时返回,总是包含’\0’

注意事项:

1 gets函数已经被淘汰,因为会导致缓冲区溢出

2 fgets 函数第二个参数,输入的数据超出size,size-1个字符会保存到缓冲区,最后添加’\0’,如果输入数据少于size-1 后面会添加换行符。

实验程序:

#include <stdio.h>

int main(int argc,char *argv[]){
    FILE *fp;
    char *ret;
    int retn;
    char buff[100];
    fp = fopen("1.txt","a+");
    if(fp==NULL){
	perror("fopen");
        return 0;
	}
#if 1  
    ret = fgets(buff,5,fp);
    if(ret==NULL){
	perror("fgets");
        fclose(fp);
        return 0;
    }
    printf("buff=%s\n",buff);
#endif
#if 0
    retn = fputs("hello world",fp);
    if(retn==-1){
	perror("fputs");

    }
    printf("hahaha\n");
#endif
    fclose(fp);

}

实验结果:

 四、行输出(输出整行)

 实验程序在上面被注释掉的

把输出位置改成屏幕也就是stdout结果为:

 

 输出到文件里:

 五、二进制读写

文本文件和二进制的区别:

存储的格式不同:文本文件只能存储文本。

计算机内码概念:文本符号在计算机内部的编码(计算机内部只能存储数字0101001....,所以所有符号都要编码)

文本文件存字符二进制文件存0和1

二进制读写函数格式:

size_t fread(void *ptr, size_t size, size_t n, FILE *fp);

void *ptr  读取内容放的位置指针

  size_t size 读取的块大小

size_t n 读取的个数

  FILE *fp  读取的文件指针

size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);

void *ptr  写文件的内容的位置指针

size_t size 写的块大小

size_t n 写的个数

  FILE *fp  要写的文件指针

注意事项:

文件写完后,文件指针指向文件末尾,如果这时候读,读不出来内容。

解决办法:移动指针到文件头;关闭文件,重新打开

 实验程序:

#include <stdio.h>
#include <stdlib.h>
int main()
{
	FILE *fp;
	fp = fopen("1.txt","r");
	if(fp == NULL)
	{
		perror("fopen");
		return 0;
	}
	char *buff;
	buff=(char*)malloc(100);
    if(buff==NULL){
       return 0;

    } 
	size_t ret;
    ret = fread(buff,10,1,fp);
    if(ret==-1){
        perror("fread");
        goto end;
    }
   
    printf("buf=%s\n",buff); 
 
end:
    free(buff);
    fclose(fp);
}

实验结果:

实验程序:

#include <stdio.h>
#include <string.h>

typedef struct {
	char name[20];
	int age;
	char sex[10];
}stu;
int main()
{
	FILE *fp;
	fp = fopen("1.bin","w");
	if(fp == NULL)
	{
		perror("fopen");
	}
	stu stu1,stu2;
	strcpy(stu1.name,"xiaoming");
	stu1.age = 20;
	strcpy(stu1.sex,"man");
	if(fwrite(&stu1,sizeof(stu1),1,fp) == -1)
	{
		printf("fwrite is default");
		return 0;
		fclose(fp);
	}	
	fclose(fp);
	fp = fopen("1.bin","r");
	if(fp == NULL)
	{
		perror("fopen");
	}
	if(fread(&stu2,sizeof(stu2),1,fp) == -1)
	{
		printf("fread is default");
		return 0;
		fclose(fp);
	}	
	printf("name:%s\nage: %d\nsex: %s\n",stu2.name,stu2.age,stu2.sex);
	fclose(fp);
	


}

实验结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

宇努力学习

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

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

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

打赏作者

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

抵扣说明:

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

余额充值