c从文件中读在使用C编程语言时,可以使用标准库函数从文件中读()从文件流中读取二进制数据并将其存储在数组或其他内存块中。这个函数在大多数允许访问操作系统文件系统的C实现中都是可用的。在GNU/Linux操作系统中,设备驱动程序映射到文件系统,从文件中读()也能够从硬件设备(特别是基于字符的设备)读取。

在这个解释从文件中读()函数,假设您熟悉所选操作系统或平台上的C语言编程基础知识。初学者可能会发现它对参加短期的基础C语言编程课程,这解释了诸如变量,函数和数组的基本概念。Udemy.com为初学者编写的C编程是一个更详细的介绍C,并且包括的另外的实例从文件中读()和C的其他文件处理程序。

打开和关闭文件

在读取文件之前,必须先打开它。一旦您使用完该文件,您应该关闭它以允许其他应用程序访问。这里使用的两个函数是fopen ()fclose ().虽然这个解释的重点是从文件中读(),而不是一般的文件处理函数,简单介绍一下这些例程可能会有所帮助。

fopen ()打开文件进行读写,并返回指向文件流的指针。它接受两个参数:第一个是要打开的文件的文件名(可以选择包括文件路径);第二个是访问模式,可以是六种设置之一。本文附带的示例代码中使用的访问模式是“r”,它打开一个文件进行读取。当使用此参数时,文件必须存在。

fclose ()关闭文件和释放所有的锁。它接受一个参数:一个成功调用返回的指针fopen ()

从文本文件中读取

下面的示例C代码从指定的文本文件中读取前200个字符,并将信息写入控制台(或shell)。要使用这些代码,您应该首先将一个文本文件放置在与应用程序相同的目录中,或者使用文本编辑器(如记事本或Vi)创建一个文本文件。

详细看调用从文件中读()下面是这个例子。源代码来自于在Microsoft Visual Studio中创建的Windows控制台应用程序项目,可能需要做一些细微的调整才能在C编译器中工作——特别是main ()函数。您应该注意到编译器被设置为使用ANSI C89,因此必须在函数的开头声明局部变量。

/ * * *从文件Udemy.com *读入C使用的fread * * /#包括INT主(INT的argc,常量字符* argv的[]){FILE * RM;炭BUF [201];printf("\r\nUdemy.com -读取文件在C\r\n");RM =的fopen( “README.TXT”, “R”);如果(RM!= NULL){的fread(BUF,1,200,RM);BUF [(BUF的sizeof)-1] = 0;的printf( “%S”,BUF);FCLOSE(RM);}其他的printf( “未找到文件\ r \ n”);}

从文件中读()具有以下功能定义:

为size_t的fread(无效* PTR,为size_t大小,为size_t nmemb个,FILE *流);

它接受的第一个参数是一个指向的存储器,这将是保持从文件中读取数据的区域。在这个例子中,代码指定字符数组(缓冲区)作为目的地。

大小参数定义要读取的单个元素的大小。char数据类型是单个字节,因此这里使用的值是1。

nmemb指定要从文件中读取多少(指定大小的)元素。值200最多从文件中读取200个字符。

最后,溪流参数指定从哪个文件流读取-通常是对的调用返回的指针fopen ()

有在上面的代码需要注意其他几个重要的点。

  1. 的返回值fopen ()对null进行检查,以确保文件已成功打开。
  2. 代码不检查调用从文件中读()是否成功,以及是否返回请求的字符数。
  3. 缓冲区数组中的最后一个元素被设置为0,以确保字符串在使用printf ()

如果文件包含的字节数少于请求的字节数,则调用fread()读取尽可能多的值并返回size_t.值表明有多少人阅读。下面定义了示例的2000个字符,然后显示多少实际上从文件流读取缓冲器阵列。

/ * * *从文件Udemy.com *读入C使用的fread * * /#包括INT主(INT的argc,常量字符* argv的[]){FILE * RM;炭BUF [2000];中期业绩;printf("\r\nUdemy.com -读取文件在C\r\n");RM =的fopen( “README.TXT”, “R”);如果(RM!= NULL){解析度=的fread(BUF,1,2000,RM);的printf( “读取%U字节\ r \ n”。,RES);FCLOSE(RM);}其他的printf( “未找到文件\ r \ n”);}

读取整个文件

对于小文件,比如从外部文件加载配置设置或资源时,一次性读取整个文件可能会很有用。为此,必须首先以字节为单位计算文件的大小。这通常涉及到库函数,例如fstat ()FSEEK()ftell () -或者针对目标平台使用特定于操作系统的文件处理例程。无论你如何计算大小,一般方法都是一样的:

  1. 计算要读取的文件的大小。
  2. 使用Malloc()分配一个足够大的内存区域来保存数据。
  3. 调用从文件中读(),指定返回的指针Malloc()作为目的地和文件的大小nmemb论点。
  4. 请记住,关闭文件并释放分配的内存Malloc()当您完成数据处理时。

对于许多应用程序来说,最好循环并读取更少的字节,直到到达文件的末尾。可以循环,直到返回值从文件中读()小于所请求的字节的数量,或使用FEOF()函数检测文件的结尾,就像这里使用的那样:

RM =的fopen( “README.TXT”, “R”);如果(RM!= NULL){而{解析度=的fread(BUF,1,(BUF的sizeof)-1,RM)(FEOF(RM)!);BUF [RES] = 0;的printf( “%S”,BUF);} FCLOSE(RM);}

从文件中读取的Structs

所有前述实施例已经基于从文件流中读取字节,并存储在数组或存储器的其他块的结果的想法。在C中,所有的数据类型都是由至少一个字节的(与许多类型中的一组顺序含有多个字节)。然而,所有类型使用的内存可以同时访问一个字节,这意味着它可以从文件中读取任何种类的值,前提是已经正确保存。

要继续下面的例子中,创建使用记事本,vi或类似的一个新的文本文件。只输入四个大字 - ABCD - 没有空格,没有换行。然后,该文件为“Test.txt的”保存在编译器将已编译的可执行文件的目录。下面的代码读取通过指定元件尺寸(2)和使用短变量作为目标指针的地址(16位整数)从文本文件。

/* * * Udemy.com *使用Fread从C中读取文件* */ #include int main(int argc, const char* argv[]) {FILE *tf;短res;printf("\r\nUdemy.com -读取文件在C\r\n");printf("Size: %u\r\n", sizeof res);tf = fopen("Test.txt", "r");Fread (&res, sizeof res, 1, tf);文件关闭(tf);printf("值:% u \ r \ n”,res);}

在Windows中,值输出将是16961,如果在文本文件中的前两个字符是A(0×41)和B(的0x42)。这两个字节从文件中读取重写由短使用在存储器中的两个字节,给res新的值0x4241 (Intel x86架构是小端式的)。

覆盖数据类型所使用的内存区域不限于单个变量。最后的代码示例从文本文件中读取相同的4个字符,并覆盖结构所使用的内存。通过这种方式,只需很少的代码就可以从外部文件加载整个结构。

/ * * *从文件Udemy.com *读入C使用的fread * * /#包括的#pragma包(1)结构TEST {炭第一;短的第二;炭第三;} MYTEST;的#pragma pack()的INT主(INT的argc,常量字符* argv的[]){FILE * TF;printf("\r\nUdemy.com -读取文件在C\r\n");tf = fopen("Test.txt", "r");的fread(&MYTEST,1,4,TF);文件关闭(tf);的printf( “第一:%C \ r \ n” 个,myTest.first); printf("Second: %u\r\n", myTest.second); printf("Third: %c\r\n", myTest.third); }

当C编译器创建的结构,他们往往他们垫的尺寸为方便他们一起工作。要成功地读取文本文件中的测试结构,您可能需要指示编译器使用不同的包装方案 - 在这种情况下,使用编译指令包(1)告诉编译器不垫结构。

用于设置结构的包装模式的过程可以C编译器之间不同。

更多的文件处理与C

从文件中读()是用于从文件中读取的最常见的函数之一,还有其他函数可以使用,为了从您的C程序中使用计算机的文件系统,您需要熟悉更多的函数。

在Udemy.com学习C编程语言中了解更多关于文件处理的常用C函数

在C#中前场

用于初学者的#.NET
里克菲利普斯
4.4 (1263)
完成c# Unity Game Developer 3D
Ben Tristem, Rick Davidson, GameDev。电视团队
4.7 (26808)
畅销书
C#中级:类,接口和OOP
MOSH HAMEDANI
4.6 (23125)
畅销书
RPG核心战斗创造者:学习中级Unity c#编码
Ben Tristem, Rick Davidson, Sam Pattuzzi, GameDev。电视团队
4.7 (8487)
C#高级主题:准备技术访谈
MOSH HAMEDANI
4.5 (15107)
完成C#MasterClass
丹尼斯•Panjuta教程。Denis Panjuta的eu
4.5 (12001)
c#和。net的设计模式
Dmitri Nesteruk
4.4 (7102)
畅销书
学习使用c#和。net进行并行编程
Dmitri Nesteruk
4.5 (2035)
畅销书
统一C#脚本:完整的C#对于Unity游戏开发betwayapp下载安装
拉贾·比斯瓦斯,Charger Games
4.5 (1388)
畅销书

更c#的课程

C#的学生还学

让你的团队。领导行业。

通过Udemy为Business获取组织的在线课程和数字学习工具库的订阅。

请求一个演示