C语言IO

本文深入探讨了C++编程的基础概念与高级应用,包括数据类型、控制结构、类与对象、模板、异常处理、多态性、泛型编程等核心主题。详细介绍了如何利用C++实现高效、安全的软件开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 错误报告

void perror( char const *message);  //定义在stdio.h中

如果message不是NULL或空字符串,perror函数会打印出message,后面跟一个分号和空格,然后打印出一条当前错误信息。

2 终止函数

void exit( int status );    //定义于stdlib.h

该函数用于终止程序的运行。status参数返回给操作系统,用于提示是否正常完成。

3 打开流

FILE *fopen ( char const *name, char const *mode );

这个函数用于打开一个流,返回一个FILE指针,name是要打开的文件或设备的名称,mode是打开模式。

执行成功会返回指针,执行失败会返回NULL。

 

读取

写入

添加

文本

r

w

a

二进制

rb

wb

b

1如果文件打开是用读取的,那么文件必须存在。

2如果文件打开是写入的,那么之前的内容会被删除,如果文件不存在就新建一个文件。

3如果添加模式打开,文件不存在也会创建,存在会在文件尾部写入数据。

FILE *fopen ( char const *name, char const *mode , FILE *stream);

这个函数会试图关闭这个流,并重新打开。

4关闭流

int fclose( FILE *f );

关闭函数会首先刷新缓冲区,然后关闭流,执行成功会返回0。

5 字符IO

int fgetc( FILE *stream );
int getc( FILE *stream );
int getchar( void );   //只从标准输入读取

每个函数从文件中读取下一个字符,如果到文件结尾就会返回常量EOF;

注意:函数的返回值为int

int fputc( int character,FILE *stream );
int fputc( int character, File *stream );
int putchar( int character );

另外:getcputcgetcharputchar都是通过define定义的宏。

 

6撤销字符IO

int ungetc( int character, FILE *stream );

ungetc把之前读入的字符返回到流中,这样可以在以后被重新读入。

7 行IO

1.        未格式化的行IO

char *fgets( char *buffer, int buffer_size, FILE *stream );
char *gets( char *buffer );
 
int fputs( char const *buffer, FILE *stream );
int puts( char const *buffer );

fgets从stream中读取字符串,复制到buffer中,它读取到换行符并存储到缓冲区后就不会再读取了。

注意:fgets()无法把数据读入小于两个字符的缓冲区,因为需要保留一个NUL

 

2.        格式化的行IO

scanf格式代码:

int main(){
    int a,b;
    while(fscanf(stdin,"%d %d",&a,&b)==2){
    //while(fscanf(stdin,"%4d %4d",&a,&b)==2){  //这里给定宽度,限制4个或更少
        printf("%d %d",a,b);
        break;
    }
}


scanf还可以从缓冲区中读取。

 

3.        printf函数


注意:sprintf输出结果很长就会溢出缓冲区,就可能改写缓冲区后面内存的数据。

4.        printf格式化:


8 二进制IO

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
size_t fwrite ( void *buffer, size_t size, size_t count, FILE *stream );

buffer是用于保存数据的内存指针,size是缓冲区字节数,count是读入/写入的元素数,stream是目标流。

9刷新和定位函数

int fflush( FILE *stream );

fflush可以把缓冲的数据立即刷新到物理硬盘中存储。

随机访问函数:

long ftell( FILE *stream );
long fseek( FILE *stream, long offset, int from )

ftell函数返回当前的位置,就是当前位置距离起始位置的偏移量。

fseek函数允许你在流中定位,改变下一个读写的位置。


fseek的替代函数:

void rewind( FILE *stream );
int fgetpos( FILE *stream, fpos_t *postion );
int fsetpos( FILE *stream, fpos_t const *postion );

rewind函数会回到文件的起始位置。fgetpos和fsetpos是ftell和fseek的替代函数。

 

9 设置缓冲方式

void setbuf( FILE *stream, char *buf );
int setvbuf( FILE *stream, char *buf, int mode, );

setbuf设置了另一个数组对流缓冲,这个数组的长度必须为BUFF_SIZE(stdio中定义)。

setvbuf的mode参数分三种模式。

1_IOFBF指定一个完全缓冲的流;

2_IONBF指定一个不完全缓冲的流;

3_IOLBF指定一个行缓冲流,每到一个换行符缓冲。

 

10 判断流的状态

int feof( FILE *stream );    //文件末尾返回true
int ferror( FILE *stream );   //出现读写错误返回true
void clearer( FILE *stream ); //错误标志重置

11临时文件

临时文件用来临时保存数据,当程序结束后就自动删除。

FILE *tmpfile( void );

12文件操纵函数

int remove( char const *filename );
int rename( char const *oldname,  char const *newname );

### C语言中的输入输出(I/O)操作概述 C语言提供了丰富的库函数来处理输入和输出操作,这些功能主要依赖于标准输入/输出流的概念。以下是关于C语言中输入输出的相关概念、示例教程以及常见问题的解答。 #### 什么是标准输入输出流? 在C语言中,默认情况下会自动打开三个标准流:`stdin`(标准输入)、`stdout`(标准输出)和`stderr`(标准错误)。这意味着当程序运行时,无需显式调用文件打开函数即可使用这些流进行交互[^1]。 #### `scanf` 和 `printf` 的基本原理 - **`printf` 函数**用于向标准输出设备发送格式化字符串。 - **`scanf` 函数**则负责从标准输入读取数据并将其存储到变量中。 两者都支持多种格式说明符,例如 `%d` 表示整数、`%f` 表示浮点数等。值得注意的是,“输入控制符”与“输出控制符”的形式相同,这使得它们易于记忆和应用[^2]。 下面是一个简单的例子展示如何利用这两个函数完成基础的数据交换: ```c #include <stdio.h> int main() { int number; printf("请输入一个整数: "); scanf("%d", &number); printf("您刚刚输入的整数是:%d\n", number); return 0; } ``` 此代码片段首先提示用户输入一个整数,接着通过 `scanf` 将该数值保存至变量 `number` 中,并最终借助 `printf` 显示出来。 #### 处理更复杂的 I/O 场景 除了上述简单案例外,在实际开发过程中可能还会遇到其他类型的 IO 需求,比如文件读写或者网络通信等高级话题。这里仅列举几个扩展方向供进一步学习探索: - 文件 I/O 操作涉及 fopen, fclose, fread, fwrite 等 API; - 使用缓冲区提高效率的方法; - 错误检测机制的重要性及其实现方式; #### 常见误区及解决方案 新手常犯的一些错误包括忘记给字符数组分配足够的空间而导致溢出风险、未初始化指针即尝试访问其所指向的内容等问题。针对这些问题可以采取如下措施加以防范: - 总是在声明之前规划好所需内存大小; - 对所有外部传入参数做严格校验后再继续执行后续逻辑运算;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值