首页 > 编程语言 >C语言:程序代码与文件的羁绊

C语言:程序代码与文件的羁绊

时间:2024-10-29 10:45:47浏览次数:8  
标签:文件 stream pFile int 羁绊 C语言 FILE 程序代码 size

目录

为什么使用文件

如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们只能使用文件。

文件认识

程序文件

程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。

数据文件

⽂件的内容不⼀定是程序,而是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件。

在以前各章所处理数据的输入输出都是以终端为对象的,即从终端的键盘输⼊数据,运⾏结果显示到显示器上。
其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上⽂件。

文件名

⼀个文件要有⼀个唯⼀的文件标识,以便用户识别和引用。
⽂件名包含3部分:文件路径+⽂件名主干+文件后缀
例如: c:\code\test.txt
为了方便起见,文件标识常被称为文件名。

⼆进制文件和文本文件

根据数据的组织形式,数据⽂件被称为文本文件或者⼆进制文件。
数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的文件中,就是⼆进制文件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是文本文件。
⼀个数据在文件中是怎么存储的呢?
字符⼀律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用⼆进制形式存储。

文件的打开和关闭

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了⽅便程序员对各种设备进行方便的操作,我们抽象出了流的概念。
C程序针对⽂件、画面、键盘等的数据输⼊输出操作都是通过流操作的。

标准流

那为什么我们从键盘输⼊数据,向屏幕上输出数据,并没有打开流呢?那是因为C语言程序在启动的时候,默认打开了3个流:
• stdin标准输⼊流,在大多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。
• stdout标准输出流,大多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出
流中。
• stderr标准错误流,大多数环境中输出到显示器界⾯。
这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。

文件指针

FILE* pf;//⽂件指针变量

文件操作符详解

文件的操作:

fopen():打开文件
文件的关闭:
fclose():关闭文件
文件的读写:
fgetc():读取一个字符
fputc():写入一个字符
fgets():读取一个字符串
fputs():写入一个字符串
fprintf():写入格式化数据
fscanf():格式化读取数据
fread():读取数据
fwrite():写入数据
文件状态检查
feof():文件是否结束
ferror():文件读/写是否出错
clearerr():清除文件错误标志
ftell():文件指针的当前位置
文件指针定位
rewind():把文件指针移到开始处
fseek():重定位文件指针

参数解释:

“r”:以只读的形式打开文本文件(不存在则出错)
“w”:以只写的形式打开文本文件(若不存在则新建,反之,则从文件起始位置写,覆盖原内容)
“a”:以追加的形式打开文本文件(若不存在,则新建;反之,在原文件后追加)
“r+”:以读写的形式打开文本文件(读时,从头开始;写时,新数据只覆盖所占的空间)
“wb”:以只写的形式打开二进制文件
“rb”:以只读的形式打开二进制文件
“ab”:以追加的形式打开一个二进制文件
“rb+”:以读写的形式打开二进制文件。
“w+”:首先建立一个新文件,进行写操作,然后从头开始读(若文件存在,原内容将全部消失)
“a+”:功能与”a”相同。只是在文件尾部追加数据后,可以从头开始读
“wb+”:功能与”w+”相同。只是在读写时,可以由位置函数设置读和写的起始位置
“ab+”:功能与”a+”相同。只是在文件尾部追加数据之后,可以由位置函数设置开始读的起始位置

文件操作符示例

文件的打开与关闭

文件在读写之前应该先打开文件,在使⽤结束之后应该关闭文件。
在编写程序的时候,在打开文件的同时,都会返回⼀个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。

//打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );

读写以字符串为例利用实例了解一下(顺序读写):
文件写入字符串代码:

/* fopen fclose example */
#include <stdio.h>
int main ()
{
 FILE * pFile;
 //打开⽂件
 pFile = fopen ("myfile.txt","w");
 //⽂件操作
 if (pFile!=NULL)
 {
 fputs ("fopen example",pFile);//文件写入
 //关闭⽂件
 fclose (pFile);
 }
 return 0;
}

读取文件字符串

int main()
{
	//1. 打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//2. 读文件
	char arr[20] = "xxxxxxxxxxxxx";
	fgets(arr, 10, pf);
	printf("%s\n", arr);

	//3. 关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

读取数据块

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

ptr:目标内存块
size:一次读取的字节大小
count:一次读取多少个 size
stream:流

#include <stdio.h>
#include <string.h>
 
int main()
{
    FILE *pFile = fopen("file.txt", "rb");
    if (pFile == NULL) 
    {
        perror ("Error opening file");
        return 0;
    }
    char buf[100] = { 0 };
    while (!feof(pFile)) //没有到文件末尾
    {
        memset(buf, 0, sizeof(buf));
        size_t len = fread(buf, sizeof(char), sizeof(buf), pFile);
        printf("buf: %s, len: %d\n", buf, len);
    }
    fclose(pFile);
}

写入数据块

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

与读取数据块同理不再做过多解释。

重定位文件指针

int fseek ( FILE * stream, long int offset, int origin );

stream:流
offset:相对应 origin 位置处的偏移量,单位为字节
origin:指针的位置

/* fseek example */
#include <stdio.h>
int main ()
{
 FILE * pFile;
 pFile = fopen ( "example.txt" , "wb" );
 fputs ( "This is an apple." , pFile );
 fseek ( pFile , 9 , SEEK_SET );
 fputs ( " sam" , pFile );
 fclose ( pFile );
 return 0;
}

获取指针位置

long int ftell ( FILE * stream );

stream:流

/* ftell example : getting size of a file */
#include <stdio.h>
int main ()
{
 FILE * pFile;
 long size;
 pFile = fopen ("myfile.txt","rb");
 if (pFile==NULL) 
 perror ("Error opening file");
 else
 {
 fseek (pFile, 0, SEEK_END); // non-portable
 size=ftell (pFile);
 fclose (pFile);
 printf ("Size of myfile.txt: %ld bytes.\n",size);
 }
 return 0;
}

文件指针移到开始处

void rewind( FILE *stream );

stream:流

清除文件错误标志

void clearerr( FILE *stream );

stream:流

文件流是否读到了文件尾

int feof( FILE *stream );

stream:流

重命名文件

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

oldname:原名
newname:新名

删除文件

int remove ( const char * filename );

filename:文件的路径


标签:文件,stream,pFile,int,羁绊,C语言,FILE,程序代码,size
From: https://blog.csdn.net/2401_88035751/article/details/143322906

相关文章

  • 基于EasyX图形化编程[C语言]
    EasyX是针对C/C++的图形库,可以帮助使用C/C++语言的程序员快速上手图形和游戏编程。本期介绍如何用EsayX进行图形化编程,代码辅助介绍#include<stdio.h>#include<easyx.h>#include<mmsystem.h>#pragmacomment(lib,"winmm.lib")//包含库文件intmain(){ //一,创建窗......
  • 线性表-单链表c语言实现
    一、基本介绍    回顾单链表的知识二、单链表#include<stdio.h> #include<cstdlib>typedefintElemType;typedefintStatus; #defineERROR0#defineOK1#defineOVERFLOW-2#defineNULL0//定义单链表中结点类型 typedefstructLNode{  ......
  • C语言教学——编程基础与C语言入门
    引言在上一篇中,我们介绍了计算机的基本组成和工作原理。本篇文章将深入探讨编程的基本概念,特别是C语言的特性和基本语法,帮助初学者更好地理解如何编写程序。我们将从编程语言的分类入手,逐步引导读者进入C语言的世界。1.编程的定义编程是指通过编写代码来创建计算机程序的过......
  • 网络编程 Linux环境 C语言实现
    进程间通信的延续跨电脑进程间通信一、远程通信方式电路交换------老式有线电话通信​报文交换​分组交换支持分时机制的(分片机制)报文交换​现行网络大部分都是采用分组交换形式二、网络&互联网&因特网网络Network:多台计算机通过某种传输介质连接在一起形成......
  • 水仙花数c语言程序:实操解答
    水仙花数(Narcissisticnumber)是指一个三位数,其各个位上数字的立方和等于该数本身。比如153就是水仙花数,因为\(1^3+5^3+3^3=153\)。以下是一个C语言程序,用于判断一个三位数是否为水仙花数,并输出100到999范围内的所有水仙花数:```c#include<stdio.h>#include<math.h>......
  • C语言和Rust在安全性特性上的区别
    #C语言和Rust在安全性特性上的区别在探讨C语言和Rust在安全性特性上的区别时,我们可以明确地指出几个核心观点:Rust提供了内存安全保证、并发安全、以及错误处理机制,这些特性在编译时就能够避免许多常见的错误类型,显著提高了软件的安全性和可靠性。其中,内存安全保证是Rust最为突......
  • C语言和Groovy在JVM兼容性上的区别
    ##C语言和Groovy在JVM兼容性上的区别在探讨C语言和Groovy在JVM(Java虚拟机)兼容性上的差异时,核心观点可以概括为:C语言不直接兼容JVM、Groovy与JVM高度兼容。C语言是一种通用的、过程式的编程语言,它直接编译为机器语言,执行效率高,但它并不直接兼容JVM,这是因为JVM是为运行Java字节码......
  • C语言中的条件编译是什么
    文章开头:在C语言中,条件编译是一种以编译器指令为基础的编程技术。这种技术允许代码在编译时进行条件判断,并根据这些条件判断来选择是否编译某些代码段,使得我们可以在不改变源代码文件的情况下,创建多个版本的程序。主要涉及的编译预处理指令有`#if`、`#ifdef`、`#ifndef`、`#elif`......
  • 微信小程序代码包下载
    从开发者工具中导出:在微信开发者工具中,你可以通过菜单栏的“项目”选项找到“导出项目”功能。选择你要导出的项目,然后按照提示操作即可将整个项目打包成一个zip文件。这个zip文件中包含了项目的所有源代码和资源文件。从GitHub等代码托管平台获取:如果你的项目已经托管在GitHub等......
  • Linux C语言实现日志模块小玩具
    有时候在调试编写程序的时候日志打印模块是必不可少的,今天我们在Linux下用C语言实现一个模块化的日志demo小玩具一、一共有以下几个文件:1).模块功能的代码实现c文件--log.c2).可供引用的头文件--log.h自行创建include文件夹放下面即可3).makefile文件--Makefile......