C/C++读取大文件数据方式详细讲解

目录
  • 前言
    • 第一种方法
    • 第二种方法
    • 第三种方法
  • 解决

前言

以前对C语言与C++不够了解时,我无法知道如何完整获取一个文件的所有数据并且不遗漏掉。

在网络上也搜索了很多很多的相关帖子,但是没有一个是真正有用的。

本文章使用C语言进行演示,如需使用C++的话原理为一样的。

以下列出那些没用的代码

第一种方法

// 创建一个变量,然后使用FILE指针打开一个文件
// 用fgetc函数与循环代码不断将数据读取到变量中
uint8_t data[4096];
FILE *fp = fopen("文件路径", "rb");
for(int x = 0; x < 4096; ++x) {
	data[x] = fgetc(fp);
}

这种方法的弊端是什么呢?

  1. 在不知道文件大小的情况下盲目直接读取可能会产生各种意想不到的情况。
  2. 就算知道文件大小,你难不成要每个文件都先看一眼大小?
  3. 代码量比较多且不易维护。

第二种方法

// 这个可以说也是我见到最多的方法了
// 但是这个方法真的很蠢,真的很蠢。
uint8_t data[4096];
uint8_t temp;
FILE *fp = fopen("文件路径", "rb");
int x = 0;
while((temp = fgetc(fp)) != EOF) {
	data[x] = temp;
	x++;
}

这种方法的好处比第一种要多,但是依旧很蠢。

  1. 可以通过EOF判断文件是否被“读取完毕”
  2. 不至于让指针像第一个那样乱来

坏处也很明显,此方法使用EOF而不是真正的文件终止符。

那么你在读取jpg或jpeg格式的图片文件时,你就会明白为什么这个方法蠢了。

第三种方法

// 这种方法类似于第一种方法
char data[4096];
FILE *fp = fopen("1.txt", "rb");
data = fgets(data, 文件大小, fp);

这个方法可以说是最没用的,因为它只能读取ASCII字符

大于0x7f 小于等于 0xff的数据都无法读取。

解决

// 使用fread函数与fwrite函数对文件进行操作
// 使用feof文件终止符判断文件是否已经读取完毕。
// 同时可以使用文件的偏移指针确定文件大小来决定变量该为多大
FILE *fp = fopen("image_1.jpg", "rb");
uint8_t *data = (uint8_t *)malloc(4096);
size_t fileSize;
while(!feof(fp)) {
	fileSize = fread(data, 1, 4096, fp);
}

这样便可以绝对确保文件被完整读取。

当然你可能会说这也没有把文件直接一次性读完啊?

那接下来我说的你就听好。

  • 先通过文件指针来获取文件的大小(Windows端请使用64位的函数)
  • 创建一个指针,指向无符号字符类型,使用的内存大小为文件大小
  • 使用fread函数一次性读取(电脑配置不高的可能会出现假死)
  • 读取完毕之后,文件就被你一次性完全读取了。
  • 请注意你的内存情况以及磁盘空间情况,否则可能会出大问题。

到此这篇关于C/C++读取大文件数据方式详细讲解的文章就介绍到这了,更多相关C++读取大文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ 读文件 将文件内容读入到字符串string中的方法

    如下所示: #include <string> #include <fstream> #include <sstream> #include <iostream> #include <stdlib.h> using namespace std; //从文件读入到string里 string readFileIntoString(char * filename) { ifstream ifile(filename); //将文件读入到ostring

  • C/C++读取大文件数据方式详细讲解

    目录 前言 第一种方法 第二种方法 第三种方法 解决 前言 以前对C语言与C++不够了解时,我无法知道如何完整获取一个文件的所有数据并且不遗漏掉. 在网络上也搜索了很多很多的相关帖子,但是没有一个是真正有用的. 本文章使用C语言进行演示,如需使用C++的话原理为一样的. 以下列出那些没用的代码 第一种方法 // 创建一个变量,然后使用FILE指针打开一个文件 // 用fgetc函数与循环代码不断将数据读取到变量中 uint8_t data[4096]; FILE *fp = fopen("文件路

  • C#使用FileStream循环读取大文件数据的方法示例

    本文实例讲述了C#使用FileStream循环读取大文件数据的方法.分享给大家供大家参考,具体如下: 今天学习了FileStream的用法,用来读取文件流,教程上都是读取小文件,一次性读取,但是如果遇到大文件,那么我们就需要循环读取文件. 直接上代码. 引用命名空间 using System.IO; 下面就是循环读取大文件的代码 class Program { static void Main(string[] args) { //循环读取大文本文件 FileStream fsRead; //获

  • 详解PHP如何读取大文件

    衡量成功 唯一能确认我们对代码所做改进是否有效的方式是:衡量一个糟糕的情况,然后对比我们已经应用改进后的衡量情况.换言之,除非我们知道 "解决方案" 能帮我们到什么程度 (如果有的话),否则我们并不知道它是否是一个解决方案. 我们可以关注两个指标.首先是 CPU 使用率.我们要处理的过程运行得有多快或多慢?其次是内存使用率.脚本执行要占用多少内存?这些通常是成反比的 - 这意味着我们能够以 CPU 使用率为代价减少内存的使用率,反之亦可. 在一个异步处理模型 (例如多进程或多线程 PH

  • php fseek函数读取大文件两种方法

    php读取大文件,使用fseek函数是最为普遍的方式,它不需要将文件的内容全部读入内存,而是直接通过指针来操作,所以效率是相当高效的.在使用fseek来对文件进行操作时,也有多种不同的方法,效率可能也是略有差别的,下面是常用的两种方法. 方法一: 首先通过fseek找到文件的最后一位EOF,然后找最后一行的起始位置,取这一行的数据,再找次一行的起始位置,再取这一行的位置,依次类推,直到找到了$num行.实现代码如下: 整个代码执行完成耗时 0.0095 (s) function tail($fp

  • PHP读取大文件的多种方法介绍

    读取大文件一直是一个头痛的问题,我们像使用php开发读取小文件可以直接使用各种函数实现,但一到大文章就会发现常用的方法是无法正常使用或时间太长太卡了,下面我们就一起来看看关于php读取大文件问题解决办法,希望例子能帮助到各位. 在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file.file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们所需要的功能.但当所操作的文件是一个比较大的文件时,这些函数可能就显的力不从心, 下面将从一个需求入手来说明对于读取

  • php使用file函数、fseek函数读取大文件效率对比分析

    php读取大文件可以使用file函数和fseek函数,但是二者之间效率可能存在差异,本文章向大家介绍php file函数与fseek函数实现大文件读取效率对比分析,需要的朋友可以参考一下. 1. 直接采用file函数来操作 由于 file函数是一次性将所有内容读入内存,而PHP为了防止一些写的比较糟糕的程序占用太多的内存而导致系统内存不足,使服务器出现宕机,所以默认情况下限制只能最大使用内存16M,这是通过php.ini里的 memory_limit = 16M 来进行设置,这个值如果设置-1,

  • PHP读取大文件的几种方法介绍

    读取大文件一直是一个头痛的问题,我们像使用php开发读取小文件可以直接使用各种函数实现,但一到大文章就会发现常用的方法是无法正常使用或时间太长太卡了,下面我们就一起来看看关于php读取大文件问题解决办法,希望例子能帮助到各位. 场景:PHP读取超大文件,例如1G的日志文件,我这里使用的是400M的access.log文件 1.使用file直接读取 <?php $starttime=microtime_float(); ini_set('memory_limit', '-1'); $file =

  • 使用Python读取大文件的方法

    背景 最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方法,本文将介绍这两种读取方法. 准备工作 我们谈到"文本处理"时,我们通常是指处理的内容.Python 将文本文件的内容读入可以操作的字符串变量非常容易.文件对象提供了三个"读"方法: .read()..readline() 和 .readlines().每种方法可以接受一个变量以限制每次读取的数据量,但它们

  • 简单了解Python读取大文件代码实例

    这篇文章主要介绍了简单了解Python读取大文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通常对于大文件读取及处理,不可能直接加载到内存中,因此进行分批次小量读取及处理 I.第一种读取方式 一行一行的读取,速度较慢 def read_line(path): with open(path, 'r', encoding='utf-8') as fout: line = fout.readline() while line: line

  • Python实现读取TXT文件数据并存进内置数据库SQLite3的方法

    本文实例讲述了Python实现读取TXT文件数据并存进内置数据库SQLite3的方法.分享给大家供大家参考,具体如下: 当TXT文件太大,计算机内存不够时,我们可以选择按行读取TXT文件,并将其存储进Python内置轻量级splite数据库,这样可以加快数据的读取速度,当我们需要重复读取数据时,这样的速度加快所带来的时间节省是非常可观的,比如,当我们在训练数据时,要迭代10万次,即要从文件中读取10万次,即使每次只加快0.1秒,那么也能节省几个小时的时间了. #创建数据库并把txt文件的数据存进

随机推荐