c++ 读取文件遇到的一个问题

今天同学问到一个问题:

下面的代码  int len = fin.tellg();

放在一个函数里用了好几年都没问题,就是最近发现出问题了。

原因:文件过大 超过了2G    读出来的文件大小 超过int表示的最大值   int溢出

#include <stdio.h>
#include <iostream>
#include <fstream>
#include <assert.h>

using namespace std;

int main() {
    int len = sizeof(unsigned int)*3 + sizeof(char);
    printf("len:%d\n", len);

    ifstream in("test.txt");
    int len2 = in.tellg();
    printf("%d", len2);
    return 0;
}

文件test.txt 不存在 返回 -1        test.txt 文件为空 返回-1

解决:定义成streampos  或者len改为一个范围更大的类型 例如 unsigned long long之类

时间: 2024-12-19 18:03:22

c++ 读取文件遇到的一个问题的相关文章

HDFS读文件过程分析:读取文件的Block数据

转自http://shiyanjun.cn/archives/962.html 我们可以从java.io.InputStream类中看到,抽象出一个read方法,用来读取已经打开的InputStream实例中的字节,每次调用read方法,会读取一个字节数据,该方法抽象定义,如下所示:public abstract int read() throws IOException;Hadoop的DFSClient.DFSInputStream类实现了该抽象逻辑,如果我们清楚了如何从HDFS中读取一个文件

使用Java FileInputStream读取文件内容到字节数组中

package date0802; import java.io.FileInputStream; import java.io.IOException; public class InputStream { @SuppressWarnings("resource") public static void main(String[] args) throws IOException { FileInputStream fileInputStream = new FileInputStr

文件切割器,一个读取流,对应多个输出流,而且生成的碎片文件都有有序的编号

import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties; public class FileSpilte { /** * @param args * @throws IOException */

有关对象流写入读取文件的一个细节

在写日志系统的时候,出于导入数据库比较方便的考虑,所以就想把用户的操作都封装在一个对象里面,然后把整个对象写到文件里面去.需要导入数据库时,再从文件中读取出对象信息,把对象写入数据库.测试的时候,对象写入文件和从文件读取对象是放在了不同的项目里,也就是说我在一个项目里执行写入操作,在另外一个项目执行读取操作.读取的项目里面的对象类是从写入操作项目里复制粘贴的.然后问题就来了,写入文件正确执行,文件里已经存在了写入的信息,但是读取文件的时候抛了异常,是classnotfoundexception,

[CrackMe]一个关于读取文件并进行运算判断的CrackMe

[CrackMe]目录索引 该程序下载地址: 链接:https://pan.baidu.com/s/1Wh033pBJObAPDtK4x-ZBYg 提取码:kjq3 复制这段内容后打开百度网盘手机App,操作更方便哦 [CrackMe]一个关于读取文件并进行运算的CrackMe 1. 首先,我们先打开该文件,什么都没输入,就显示注册错误,一脸懵逼... 2. 之后,我们使用OD打开该程序,跳转到该界面暂停,然后通过栈回溯到程序的执行主流程. 3. 查看上面,似乎读取一个名为 "KeyFile.d

Java如何实现按指定行读取文件

最近在开发实战中,遇到了一个这样的技术情景: 把log4j生成的日志文件定时刷进MySQL数据库,比如三个小时刷一次,那么每次刷数据的时候,如何控制文件读取是从上一次文件读取结束的地方开始继续读取的?并且本次要读取到文件结尾处.在网上各种搜索提问后,找到了一个叫RandomAccessFile Java类解决了问题. 先上代码: static int size=1;//主要是为了控制循环的次数,因为是定时刷,每次刷的文件行数可能不一样 static long chars=0;//chars指的是

Java利用内存映射文件实现按行读取文件

我们知道内存映射文件读取是各种读取方式中速度最快的,但是内存映射文件读取的API里没有提供按行读取的方法,需要自己实现.下面就是我利用内存映射文件实现按行读取文件的方法,如有错误之处请指出,或者有更好更快的实现方式麻烦也提供一下代码. 代码如下: public class testMemoryMappedFile { public static void main(String[] agrs) throws IOException{ RandomAccessFile memoryMappedFi

使用FileReader接口读取文件内容

如果想要读取或浏览文件,则需要通过FileReader接口,该接口不仅可以读取图片文件,还可以读取文本或二进制文件,同时,根据该接口提供的事件与方法,可以动态侦察文件读取时的详细状态,接下来,我们详细介绍FileReader接口的使用方法. FileReader 接口 FileReader 接口提供了一个异步的API,通过这个API可以从浏览器主线程中异步访问文件系统中的数据,基于此原因,FileReader 接口可以读取文件中的数据,并将读取的数据放入内存中. 当访问不同文件时,必须重新调用F

实现按行读取文件,把内容按照第三种内存模型打包数据传出,把行数通过函数参数传出。

/* 2 编写一个业务函数,实现按行读取文件.把内容按照第三种内存模型打包数据传出,把行数通过函数参数传出. 函数原型有两个,任意选择其一 要求1:请自己任意选择一个接口(函数),并实现功能:70分 要求2:编写测试用例.30分 要求3:自己编写内存释放函数 */ /********************************************************************** * 版权所有 (C)2015, Wu Yingqiang. * * 文件名称:ReadFi