Linux-C P4 输入输出

Linux-C P4 输入输出

在这里插入图片描述

基础输入输出

在这里插入图片描述

基本输入输出会讲到经常会用到的一些输入输出函数,下面先来介绍关于字符的输入与输出(有关字符等数据类型的内容 参见Linux-C P2 数据类型

字符输入(getchar)

内容
函数名称getchar
所需头文件#include <stdio.h>
函数原型int getchar(void)
函数功能在键盘上读取一个字符
函数传入值
函数返回值成功:返回读到的字符
失败:-1

字符输入函数(getchar),根据函数表可以看出需要调用头文件#include <stdio.h>(有关头文件的介绍,参见 扩展 stdio.h头文件)

它的功能是在键盘上读取一个字符,对是一个字符,你输多了它是不会接收的。

举个栗子

在这里插入图片描述

#include <stdio.h>

int main(int argc, const char *argv[])
{
	char c;
	c = getchar();
	printf("c = %c\n",c);
	return 0;
}

在这里插入图片描述


垃圾字符处理

什么是垃圾字符处理呢?
在输入函数输入内容时,你不想要获取却获取到的字符就是垃圾字符

关于scanf函数接收内容时的垃圾字符处理问题

举个栗子

在这里插入图片描述
在这里插入图片描述
这里输入了数字之后,并没有接着输入字符就直接输出结果了,所以b就是接收了回车,这是因为切换到下一个输入的函数之前我们按了回车,而这个回车就是垃圾字符,因此需要被处理掉

在这里插入图片描述

#include <stdio.h>

int main(int argc, const char *argv[])
{
	int a;
	char b;

	scanf("%d",&a);
	getchar();
	scanf("%c",&b);

	printf("a = %d,b = %c",a,b);
	return 0;
}

这里加了一个getchar之后就处理了这个回车,这样我们的程序就能按照想要的样子运行了

在这里插入图片描述

字符输出(putchar)

内容
函数名称putchar
所需头文件#include <stdio.h>
函数原型int putchar(int char)
函数功能把参数char里的字符打印出来
函数传入值char:输入的字符(以其对应的int值进行传递)
函数返回值成功:字符对应的int值
失败:-1

介绍完字符输入(getchar),接着就是字符输出(putchar),这里可以将需要被打印在终端的字符打印出来

举个栗子

在这里插入图片描述

#include <stdio.h>

int main(int argc, const char *argv[])
{
	int c;
	c = getchar();
	putchar(c);
	return 0;
}

在这里插入图片描述

通过getchar获取一个字符内容给c,在通过putchar将c打印出来

是不是很简单呢?

所以来点更有趣的,也是最常用的格式化输入(scanf)和格式化输出(printf)

格式化输入(scanf)

内容
函数名称scanf
所需头文件#include <stdio.h>
函数原型int scanf(char * format,…)
函数功能从标准输入方式读取格式化输入
函数传入值format:[=%[*][width][modifiers]type=] 字符串
函数返回值成功:成功匹配和赋值的个数
失败:-1

格式化输入函数(scanf),重点当然是格式化了,可以通过它读入指定格式的内容

先来介绍一下format传入值应该如何填写吧!

[=%[*][width][length]type=]

参数描述
*可选,表示数据是从流 stream 中读取的,但是可以被忽视,即它不存储在对应的参数中
width可选,这指定了在当前读取操作中读取的最大字符数
length可选,用于限定不同说明符的长度,就是说明符的修饰符
type即说明符的类型

这里的*先不做讲解,widthlength都是可选的,所以先讲讲这个type后面再来扩展widthlength

类型功能参数的类型
%c读取下一字符char
%s读入字符串char
%d读取十进制整数int
%o读入八机制整数int
%x、%X读入十六进制整数int
%u读入无符号的十进制整数unsigned int
%i读入十进制、八进制、十六进制整数int
%f读取一个单、双精度浮点数(需要使用 lf)float、double
%e读取指数形式的浮点型float、double
%p读入一个指针

这里先介绍scanf使用方法,详细例子会在讲完printf之后一起给出。

scanf读取一个字符,注意这里要加上**&**(&的有关内容,可以参见 Liunx-C P7 指针)

char c;
scanf("%c",&c);

scanf读取字符串

char s[100];
scanf("%s",s);

scanf读取十进制整数

int a;
scanf("%d",&a);

scanf读取八进制整数

int b;
scanf("%o",&b);

scanf读取十六进制整数

int c;
scanf("%x",&c);

scanf读取无符号的十进制整数

int d;
scanf("%u",&d);

scanf读取十进制、八进制、十六进制整数

int e;
scanf("%i",&e);

scanf读取一个浮点型

float a;
scanf("%f",&a);

scanf读取一个指数形式浮点型

float b;
scanf("%e",&b);

scanf读取一个指针(这里不做讲解,可以参见 Liunx-C P7 指针


到了扩展的时候,先来介绍这个width

scanf读取指定了长度的内容

float a;
scanf("%5f",&a);

接着再来看看length

修饰符功能
h用于d、o、x前,指定输入为short型整数
l用于d、o、x前,指定输入为long型整数
l用于e、f前,指定输入为double型实数

scanf读取short型整数

short int a;
scanf("%hd",&a);

scanf读取long型整数

long int b;
scanf("%ld",&b);

scanf读取double型实数

double c;
scanf("%lf",&c);

格式化输出(printf)

内容
函数名称printf
所需头文件#include <stdio.h>
函数原型int printf(char *format,…)
函数功能发送格式化输出到标准书stdout
函数传入值format:%[flags][width][.precision][length]specifier
函数返回值成功:写入的字符总数
错误:-1

同样的printfformat需要详细的介绍一下,再结合之前的scanf给出例子供大家理解

%[flags][width][.precision][length]specifier

参数描述
flags可选,标志位
width指定最小字段的宽度
.precision指定的宽度的精度
length说明符的长度修饰符
specifier转换字符(说明符)

先来看看转换字符*(specifier),功能与scanf里的基本相同

类型功能参数的类型
%c读取下一字符char
%s读入字符串char
%d读取十进制整数int
%o读入八机制整数int
%x、%X读入十六进制整数int
%u读入无符号的十进制整数unsigned int
%i读入十进制、八进制、十六进制整数int
%f读取一个单、双精度浮点数(需要使用 lf)float、double
%e读取指数形式的浮点型float、double
%p读入一个指针

printf读取一个字符

char c = 'c';
printf("c = %c\n",c);

printf读取字符串

char s[100] = "sssss";
printf("s = %s\n",s);

举个栗子

在这里插入图片描述

#include <stdio.h>

int main(int argc, const char *argv[])
{
	char c;
	char s[100];
	
	scanf("%c",&c);
	scanf("%s",s);

	printf("c = %c\n",c);
	printf("s = %s\n",s);
	return 0;
}

在这里插入图片描述


printf读取十进制整数

int a = 12;
printf("%d\n",a);

printf读取八进制整数

int b = 34;
scanf("%o",&b);

printf读取十六进制整数

int c = 56;
printf("%x\n",c);

printf读取无符号的十进制整数

int d = 78;
printf("%u\n",d);

printf读取十进制、八进制、十六进制整数

int e = 90;
printf("%i\n",e);

举个栗子

在这里插入图片描述

#include <stdio.h>

int main(int argc, const char *argv[])
{
	int a,b,c,d,e;

	scanf("%d",&a);
	scanf("%o",&b);
	scanf("%x",&c);
	scanf("%u",&d);
	scanf("%i",&e);

	printf("%d\n",a);
	printf("%o\n",b);
	printf("%x\n",c);
	printf("%u\n",d);
	printf("%i\n",e);

	return 0;
}

在这里插入图片描述


printf读取一个浮点型

float a = 12.34;
printf("%f\n",a);

printf读取一个指数形式浮点型

float b = 56e7;
printf("%e\n",b);

举个栗子

在这里插入图片描述

#include <stdio.h>

int main(int argc, const char *argv[])
{
	float a,b;

	scanf("%f",&a);
	scanf("%e",&b);

	printf("%f\n",a);
	printf("%e\n",b);
	return 0;
}

在这里插入图片描述


width和.precision

width指定最小字段的宽度,而**.precision则指定了宽度的精度**,就这样说也没有什么深刻的印象

举个栗子

在这里插入图片描述

#include <stdio.h>

int main(int argc, const char *argv[])
{
	float a;

	scanf("%5f",&a);

	printf("%5.3f\n",a);

	return 0;
}

在这里插入图片描述


flags是个可选项,加上之后就规定了输入内容的一些标志规定

标志内容
-指定被转换的参数在其字段内容左对齐(默认是右对齐)
+指定在输出的数前面加上正负号
空格如果第一个字符不是正负号,则在其前面加上一个空格
0对于数值转换,当输出长度小于字段宽度时,添加前导0进行填充
#指定另一种输出形式

左对齐与右对齐

在这里插入图片描述

#include <stdio.h>

int main(int argc, const char *argv[])
{
	float a = 12.34;
	
	printf("%10f\n",a);

	printf("%-10f\n",a);
	
	return 0;
}

在这里插入图片描述

正负号问题

在这里插入图片描述

#include <stdio.h>

int main(int argc, const char *argv[])
{
	int a = 5,b = -5;

	printf("%+d,%+d\n",a,b);
	printf("% d\n",a);

	return 0;
}

在这里插入图片描述


length的功能与scanf的基本相同

修饰符功能
h用于d、o、x前,指定输入为short型整数
l用于d、o、x前,指定输入为long型整数
l用于e、f前,指定输入为double型实数

printf读取short型整数

short int a;
printf("%hd\n",a);

printf读取long型整数

long int b;
printf("%ld\n",b);

printf读取double型实数

double c;
printf("%lf\n",c);

举个栗子

在这里插入图片描述

#include <stdio.h>

int main(int argc, const char *argv[])
{
	short int a;
	long int b;
	double c;

	scanf("%hd",&a);
	scanf("%ld",&b);
	scanf("%lf",&c);

	printf("%hd\n",a);
	printf("%ld\n",b);
	printf("%lf\n",c);
	return 0;
}

在这里插入图片描述

字符串输入(gets)

内容
函数名称gets
所需头文件#include <stdio.h>
函数原型char *gets(char *str)
函数功能从标准输入stdin读取一行,并把它存储在str所指向的字符串中
函数传入值str:这是指向一个字符数组的指针,该数组存储了c字符串
函数返回值成功:返回str
失败:-1

在这里插入图片描述

#include <stdio.h>

int main(int argc, const char *argv[])
{
	char s[100];

	printf("input:");
	gets(s);

	printf("%s\n",s);
	return 0;
}

在这里插入图片描述

字符串输出(puts)

内容
函数名称puts
所需头文件#include <stdio.h>
函数原型int puts(const char *str)
函数功能把一个字符串写入到标准输出stdout
函数传入值str:这是要被写入的c字符串
函数返回值成功:返回一个非负值
失败:-1

在这里插入图片描述


#include <stdio.h>

int main(int argc, const char *argv[])
{
	char s[100];

	printf("input:");
	gets(s);
	puts(s);

	return 0;
}

在这里插入图片描述

文件输入输出

在这里插入图片描述

读取文件中一个字符(getc、fgetc)

内容
函数名称getc
所需头文件#include <stdio.h>
函数原型int getc(FILE *stream)
函数功能在指定的流stream获取下一个字符,并把位置标识符往前移动
函数传入值stream:这是指向FILE对象的指针,该FILE对象标识了要在上面执行操作的流
函数返回值成功:返回读取的字符
失败:-1

在这里插入图片描述

#include <stdio.h>

int main(int argc, const char *argv[])
{
	char c;

	printf("请输入字符:");
	c = getc(stdin);
	printf("输入的字符:");
	putc(c,stdout);
	printf("\n");

	return 0;
}

在这里插入图片描述

内容
函数名称fgetc
所需头文件#include <stdio.h>
函数原型int fgetc(FILE *stream)
函数功能从指定的流stream获取下一个字符,并把位置标识符往前移动
函数传入值stream:这是指向FILE对象的指针,该FILE对象标识了要在上面执行操作的流
函数返回值成功:以无符号char强制转换为int的形式返回读取的字符
失败:-1

编写file.txt

在这里插入图片描述
在这里插入图片描述

#include <stdio.h>

int main(int argc, const char *argv[])
{
	FILE *fp;
	int c;
	int n = 0;

	fp = fopen("file.txt","r");

	if(fp == NULL){
		perror("打开文件时发生错误");
		return -1;
	}

	do{
		c = fgetc(fp);
		if(feof(fp)){
			break;
		}
		printf("%c",c);
	}while(1);

	fclose(fp);
	return 0;
}

在这里插入图片描述

写入文件中一个字符(putc、fputc)

内容
函数名称putc
所需头文件#include <stdio.h>
函数原型int putc(int char,FILE *stream)
函数功能把参数char指定的字符写入到指定的流stream中并把位置标识符往前移动
函数传入值char:这是要被写入的字符。该字符以其对应的int值进行传递
stream:这是指向FILE对象的指针,该FILE对象标识了要被写入字符的流
函数返回值成功:以无符号char强制转换为int的形式返回写入的字符
失败:-1

在这里插入图片描述

#include <stdio.h>

int main(int argc, const char *argv[])
{
	FILE *fp;
	int ch;

	fp = fopen("file.txt","w");
	for(ch = 65;ch <= 70;ch++){
		putc(ch,fp);
	}

	fclose(fp);
	return 0;
}

在这里插入图片描述

内容
函数名称fputc
所需头文件#include <stdio.h>
函数原型int fputc(int char,FILE *stream)
函数功能把参数char指定的字符写入到指定的流stream中,并把位置标识符往前移动
函数传入值char:这是要被写入的字符
stream:这是指向FILE对象的指针,该FILE对象标识了要被写入的字符流
函数返回值成功:返回被写入的字符
失败:-1

使用方法与上面的相同

格式化读取文件数据(fscanf)

内容
函数名称fscanf
所需头文件#include <stdio.h>
函数原型int fscanf(FILE *stream,const char *format,…)
函数功能从流stream读取格式化输入
函数传入值stream:这是指向FILE对象的指针,该FILE对象标识了流
format:[=%[*][width][modifiers]type=]
函数返回值成功:返回成功匹配和赋值的个数
失败:-1

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char *argv[])
{
	char str1[10],str2[10];
	FILE *fp;

	fp = fopen("file.txt","w+");
	fputs("Hello Cage",fp);

	rewind(fp);
	fscanf(fp,"%s %s",str1,str2);

	printf("Read String1 %s\n",str1);
	printf("Read String2 %s\n",str2);

	fclose(fp);
	return 0;
}

在这里插入图片描述

格式化写入文件数据(fprintf)

内容
函数名称fprintf
所需头文件#include <stdio.h>
函数原型int fprintf(FILE *stream,const char *format,…)
函数功能发送格式化输出到流stream中
函数传入值stream:这是指向FILE对象的指针,该FILE对象标识了流
format:%[flags][width][.precision][length]specifier
函数返回值成功:返回写入的字符总数
失败:-1

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char *argv[])
{
	FILE *fp;

	fp = fopen("file.txt","w+");
	fprintf(fp,"%s %s %d","Hello","Cage",2020);

	fclose(fp);
	return 0;
}

在这里插入图片描述

读取文件字符串(fgets)

内容
函数名称fgets
所需头文件#include <stdio.h>
函数原型char *fgets(char *str,int n,FILE *stream)
函数功能从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。
函数传入值str :这是指向一个字符数组的指针,该数组存储了要读取的字符串
n :这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度
stream :这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流
函数返回值成功:返回相同的 str 参数
失败:-1

在这里插入图片描述

#include <stdio.h>

int main(int argc, const char *argv[])
{
	FILE *fp;
	char str[60];

	fp = fopen("file.txt","r");
	if(fp == NULL){
		perror("打开文件时发生错误");
		return -1;
	}
	if(fgets(str,60,fp)!=NULL){
		puts(str);
	}

	fclose(fp);
	return 0;
}

在这里插入图片描述

写入文件字符串(fputs)

内容
函数名称fputs
所需头文件#include <stdio.h>
函数原型int fputs(const char *str,FILE *stream)
函数功能把字符串写入到指定的流 stream 中,但不包括空字符
函数传入值str: 这是一个数组,包含了要写入的以空字符终止的字符序列
stream: 这是指向FILE对象的指针,改FILE对象标识了要被写入字符串的流
函数返回值成功:非负值
失败:-1

在这里插入图片描述

#include <stdio.h>

int main(int argc, const char *argv[])
{
	FILE *fp;
	fp = fopen("file.txt","w+");

	fputs("Hello Cage !!",fp);

	fclose(fp);
	return 0;
}

在这里插入图片描述

读取文件数据(fread)

内容
函数名称fread
所需头文件#include <stdio.h>
函数原型size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream)
函数功能从给定流 stream 读取数据到 ptr 所指向的数组中
函数传入值ptr: 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针
size:这是要读取的每个元素的大小,以字节为单位
nmemb:这是元素的个数,每个元素的大小为 size 字节
stream:这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流
函数返回值成功:读取的元素总数会以 size_t 对象返回
失败:-1

在这里插入图片描述

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

int main(int argc, const char *argv[])
{
	FILE *fp;
	char c[] = "Hello Cage";
	char buffer[20];

	fp = fopen("file.txt","w+");
	fwrite(c,strlen(c)+1,1,fp);
	fseek(fp,0,SEEK_SET);
	fread(buffer,strlen(c)+1,1,fp);
	printf("%s\n",buffer);

	fclose(fp);
	return 0;
}

在这里插入图片描述

写入文件数据(fwrite)

内容
函数名称fwrite
所需头文件#include <stdio.h>
函数原型size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE *stream)
函数功能把 ptr 所指向的数组中的数据写入到给定流 stream 中
函数传入值ptr:这是指向要被写入的元素数组的指针
size:这是要被写入的每个元素的大小,以字节为单位
nmemb:这是元素的个数,每个元素的大小为 size 字节
stream: 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流
函数返回值成功:读取的元素总数会以 size_t 对象返回
失败:-1

使用方法同上

数据到字符串

在这里插入图片描述

写入格式化数据到字符串(sprintf)

内容
函数名称sprintf
所需头文件#include <stdio.h>
函数原型int sprintf(char *str,const char *format,…)
函数功能发送格式化输出到str所指向的字符串
函数传入值str:指向一个字符数组的指针,该数组存错了C字符串
format:这是字符串,包含了要被写入到字符串 str 的文本
函数返回值成功:返回写入的字符总数
失败:-1

在这里插入图片描述

#include <stdio.h>

int main(int argc, const char *argv[])
{
	char s[100];
	float f = 1024.1234;
	sprintf(s,"s = %f",f);
	puts(s);
	return 0;
}

在这里插入图片描述

写入指定尺寸的格式化数据到字符串(snprintf)

内容
函数名称snprintf
所需头文件#include <stdio.h>
函数原型int snprintf(char *str,size_t size,const char *format,…)
函数功能设将可变参数(…)按照 format 格式化成字符串,并将字符串复制到 str 中,size 为要写入的字符的最大数目,超过 size 会被截断
函数传入值str: 目标字符串
size: 拷贝字节数
format:格式化成的字符串
…: 可变参数
函数返回值成功:指定最大范围内的字符串长度
失败:-1

在这里插入图片描述

#include <stdio.h>

int main(int argc, const char *argv[])
{
	char s[100];
	float f = 1024.1234;
	snprintf(s,16,"s = %f ffsesegseg",f);
	puts(s);
	return 0;
}

在这里插入图片描述

更多内容

Linux-C P1 Linux基础与Vi操作

Linux-C P2 数据类型

Linux-C P3 运算符和表达式

Linux-C P5 控制语句

Linux-C P6 数组

Linux-C P7 指针

Linux-C P8 函数

Linux-C P9 内存管理

Linux-C P10 结构体细讲

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CagePan

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

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

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

打赏作者

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

抵扣说明:

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

余额充值