首页 > 其他分享 >45. 文件的顺序读写

45. 文件的顺序读写

时间:2024-09-02 14:54:04浏览次数:10  
标签:文件 顺序 stream int 读写 45 printf buf size


1 按照字符读写文件fgetc、fputc

1.1. 写文件

#include <stdio.h>
int fputc(int ch, FILE * stream);

功能:将ch转换为unsigned char后写入stream指定的文件中

参数:

ch:需要写入文件的字符

stream:文件指针

返回值:

成功:成功写入文件的字符

失败:返回-1

char buf[] = "My name is Tao.";
int i = 0;
int n = strlen(buf);
for(i = 0; i < n; i++)
{
	// 往文件fp写入符buf[i]
	int ch = fputc(buf[i], fp);
	printf("ch = %c\n", ch);
}

1.2. 文件结尾

在C语言中,EOF表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志

#define EOF    (-1)

当把数据以二进制形式存放到文件中时,就会有-1值的出现,因此不能采用EOF作为二进制文件的结束标志。为解决这一个问题,ANSI C提供一个feof函数,用来判断文件是否结束。feof函数既可用以判断二进制文件又可用以判断文本文件

#include <stdio.h>
int feof(FILE * stream);

功能:检测是否读取到了文件结尾。判断的是最后一次“读操作的内容”,不是当前位置内容(上一个内容)。

参数:

stream:文件指针

返回值:

非0值:已经到文件结尾

0:没有到文件结尾

1.3. 读文件

#include <stdio.h>
int fgetc(FILE * stream);

功能:从stream指定的文件中读取一个字符

参数:

stream:文件指针

返回值:

成功:返回读取到的字符

失败:-1

char ch;
#if 0
while((ch = fgetc(fp)) != EOF)
{
	printf("%c", ch);
}
printf("\n");
#endif

while(!feop(fp)) //文件没有结束,则执行循环
{
	ch = fgetc(fp);
	printf("%c", ch);
};
printf("\n");

2 按照行读写文件fgets、fputs

2.1. 写文件

#include <stdio.h>
int fputs(const char * str, FILE * stream);

功能:将str所指定的字符串写入到stream指定的文件中,字符串结束符 ‘\0’ 不写入文件。

参数:

str:字符串

stream:文件指针

返回值:

成功:0

失败:-1

char *buf[] = { "123456\n", "bbbbbbbbbb\n", "ccccccccccc\n" };
int i = 0;
int n = 3;
for (i = 0; i < n; i++)
{
	int len = fputs(buf[i], fp);
	printf("len = %d\n", len);
}

2.2. 读文件

#include <stdio.h>
char * fgets(char * str, int size, FILE * stream);

功能:从stream指定的文件内读入字符,保存到str所指定的内存空间,直到出现换行字符、读到文件结尾或是已读了size - 1个字符为止,最后会自动加上字符 ‘\0’ 作为字符串结束。

参数:

str:字符串

size:指定最大读取字符串的长度(size - 1)

stream:文件指针

返回值:

成功:成功读取的字符串

读到文件尾或出错: NULL

char buf[100] = {0};
while(!feof(fp))
{
	memset(buf, 0, sizeof(buf));
	char *p = gets(buf, sizeof(buf), fp);
	if(p != NULL)
	{
		printf("buf = %s", buf);
	}
}

2.3. 强化训练:文件版四则运算

有个文件大小不确定,每行内容都是一个四则运算表达式,还没有算出结果,写一个程序,自动算出其结果后修改文件

45. 文件的顺序读写_写入文件

3 按照格式化文件fprintf、fscanf

3.1. 写文件

#include <stdio.h>
int fprintf(FILE * stream, const char * format, ...);

功能:根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中,指定出现字符串结束符 ‘\0’ 为止。

参数:

stream:已经打开的文件

format:字符串格式,用法和printf()一样

返回值:

成功:实际写入文件的字符个数

失败:-1

fprintf(fp, "%d %d %d\n", 1, 2, 3);

3.2. 读文件

#include <stdio.h>
int fscanf(FILE * stream, const char * format, ...);

功能:从stream指定的文件读取字符串,并根据参数format字符串来转换并格式化数据。

参数:

stream:已经打开的文件

format:字符串格式,用法和scanf()一样

返回值:

成功:参数数目,成功转换的值的个数

失败: - 1

int a = 0;
int b = 0;
int c = 0;
fscanf(fp, "%d %d %d\n", &a, &b, &c);
printf("a = %d, b = %d, c = %d\n", a, b, c);

45. 文件的顺序读写_c++_02

4 按照块读写文件fread、fwrite

4.1. 写文件

#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

功能:以数据块的方式给文件写入内容

参数:

ptr:准备写入文件数据的地址

size: size_t 为 unsigned int类型,此参数指定写入文件内容的块数据大小

nmemb:写入文件的块数,写入文件数据总大小为:size * nmemb

stream:已经打开的文件指针

返回值:

成功:实际成功写入文件数据的块数目,此值和 nmemb 相等

失败:0

typedef struct Stu
{
	char name[50];
	int id; 
}Stu;

Stu s[3];
int i = 0;
for(i = 0; i < 3; i++)
{
    sprintf(s[i].name, "stu%d%d%d", i, i, i);
    s[i].id = i + 1;
}

int ret = fwrite(s, sizeof(Stu), 3, fp);
printf("ret = %d\n", ret);

4.2. 读文件

#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

功能:以数据块的方式从文件中读取内容

参数:

ptr:存放读取出来数据的内存空间

size: size_t 为 unsigned int类型,此参数指定读取文件内容的块数据大小

nmemb:读取文件的块数,读取文件数据总大小为:size * nmemb

stream:已经打开的文件指针

返回值:

成功:实际成功读取到内容的块数,如果此值比nmemb小,但大于0,说明读到文件的结尾。

失败:0

0: 表示读到文件结尾。(feof())

typedef struct Stu
{
	char name[50];
    int id;
}Stu;

Stu s[3];
int ret = fread(s, sizeof(Stu), 3, fp);
printf("ret = %d\n", ret);

int i = 0;
for(i = 0; i < 3; i++)
{
    printf("s = %s, %d\n", s[i].name, s[i].id);
}


标签:文件,顺序,stream,int,读写,45,printf,buf,size
From: https://blog.51cto.com/zaishu/11898132

相关文章

  • I2C通信中,使用FIFO时的读写时序
    在I2C通信中,使用FIFO(First-InFirst-Out)缓冲区可以显著提高数据传输的效率和可靠性。当使用FIFO时,读写时序会有一些特定的要求和优化,以确保数据传输的正确性和高效性。下面详细介绍使用FIFO时的读写时序。读写时序的基本原则在使用I2CFIFO时,读写时序需要考虑以下几个方面:初......
  • 关于GD32F450ZG系列板卡对RS232发送数据前后不匹配
            先说一下问题,在Keil5开发环境下对板卡上的RS232串口进行配置,要求发送0x5A一笔数据,但实际在串口调试助手中收到0xEC0xF3两笔数据,前后发送的数据不匹配。    针对这个问题,对一下几点重新检查,并确保无误:    1、检查引脚使能情况;    ......
  • 51c大模型~合集45
    #OpenAI家庭机器人NEO登场动作丝滑逼近人类!穿着西装的「人」却专做家务OpenAI支持的明星初创1XTechnologies,发布了最新的通用家务机器人NEO。不仅外形自然拟人,还有仿生设计带来的丝滑动作。不想干的家务,真的可以让机器人帮忙了!继Optimus和擎天柱之后,人形机器人领域又闯入一员猛将......
  • 基于Keil软件实现软件I2C读写MPU6050(江协科技HAL库)
    软件I2C读写MPU6050实验是基于江协科技STM32的HAL库工程模板创建的(可以在作品“基于江科大STM32创建的HAL库工程模板”中的结尾处获取工程模板的百度网盘链接)复制“OLED显示”的工程文件——“4-1 OLED显示屏”,并命名为“10-1 软件I2C读写MPU6050 ”。打开工程,把下面的程序......
  • 栈和队列(1)——顺序栈,链栈
    数据结构:栈和队列(1)–顺序栈,链栈提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录数据结构:栈和队列(1)--顺序栈,链栈前言一、栈和队列1.1栈和队列的定义1.2队列的定义二、栈实现操作2.1顺序栈的结构体定义2.2顺序栈的基本操作:2.3链栈的结构体定......
  • 455. 分发饼干
    假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >=g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子......
  • eladmin (文件上传+文件删除)(cve-2024-7458)
    侵权声明本文章中的所有内容(包括但不限于文字、图像和其他媒体)仅供教育和参考目的。如果在本文章中使用了任何受版权保护的材料,我们满怀敬意地承认该内容的版权归原作者所有。如果您是版权持有人,并且认为您的作品被侵犯,请通过以下方式与我们联系:[[email protected]]。我们将在确......
  • STM32--硬件读写W25Q64
    声明:我是跟着B站江科大的视频的学习过程中记录下来作者的文案,记录下来是为了方便自己日后复习。如果你也是跟着江科大的视频学习的,可以一起学习。我把其中一些白话进行了修改,并且添加了自己的一些理解。我只有一些pyhon基础,所以可能有错误,学起来也比较吃力,就把自己的一些理解......
  • C语言 ——— 文件的顺序读写
    目录顺序读写函数介绍​编辑测试fputc函数​编辑测试fgetc函数​编辑测试fputs函数​编辑测试fputs 函数​编辑测试fgets函数​编辑顺序读写函数介绍 测试fputc函数第一个参数是传递字符,第二个参数传递文件指针 #include<stdio.h>intmain(){ //......
  • IO进程练习:请在linux 利用c语言编程实现两个线程按照顺序依次输出”ABABABAB......“
    例如:a线程输出”A”之后b线程输出”B”,然后a线程输出“A”,再b线程输出”B”,之后往复循环。【1】使用信号量实现代码展示:#include<stdio.h>#include<pthread.h>#include<string.h>#include<semaphore.h>#include<unistd.h>//定义两个全局信号量,实现同步机制se......