c-C++读文件没读完就结束,eof已用

问题描述

C++读文件没读完就结束,eof已用
这段代码是我写哈夫曼编码的一个解压函数,现在的问题是,没有把我整个文件解压完像图里面,只解压了一部分然后 ,还有剩下很多没读,
貌似是eof为真,导致读文件结束了 这是怎么回事啊?

void readCodeFile()
{
ifstream inf;
ofstream outf;
int w[200] c = 0;
char s[200];
string code;
HuffTreeTreeArray[100];
HuffNode
tempNode;
char tempChar=0;
int k = 9;

inf.open(""test.txt""ios::in);inf >> c;for (int i = 0; i < c; i++){    s[i] = inf.get();    inf >> w[i];    //cout << s[i] << ""t"" << w[i] << ""t""<<i<<endl;}Word *word = new Word[c];for (int i = 0; i < c; i++){    word[i].val = s[i];    word[i].frq = w[i];}for (int i = 0; i < c + 1; i++){    TreeArray[i] = new HuffTree<char>(s[i] w[i]);}HuffTree<char> *Tree = buildHuff(TreeArray c);codeBuild(Tree->root() code word c);outf.open(""decode.txt"");tempNode = Tree->root();while (!inf.eof()){       if (k<8)    {        if (((tempChar >> (7 - k)) & 1) == 0)        {            tempNode = ((IntlNode<char>*) (tempNode))->right();        }        else if (((tempChar >> (7 - k)) & 1) == 1)        {            tempNode = ((IntlNode<char>*) (tempNode))->left();        }        if (tempNode->isLeaf())        {            outf << ((LeafNode<char>*) (tempNode))->val();        //  cout << ((LeafNode<char>*) (tempNode))->val();            tempNode = Tree->root();        }        k++;    }    else    {        tempChar = inf.get();        cout << tempChar;        k = 0;    }       }inf.close();outf.close();

}

解决方案

你用的是文本方式读取文件吧?加密内容可能会包含字符,而文本方式读取是吧判断为eof的。
要用二进制方式读取。

解决方案二:
你可以试试在文件的最后加一个特定的字符,当遇到这个字符就结束循环

解决方案三:
EOF只是一个宏,值为-1,如果读取失败的情况下,也会返回这个数值

解决方案四:
windows下^D(字符4)作为结束符,应该是文本中包含此字符,可以用""rb""方式打开(二进制打开)

时间: 2024-08-03 15:01:49

c-C++读文件没读完就结束,eof已用的相关文章

erlang读文件的速度为啥这么慢?

问题描述 今天公司技术比武,比赛题目是给一个1.1g的大文本,统计文本中词频最高的前十个词.花了两天用erlang写完了代码,但是放到公司16核的机器上这么一跑,结果不比不知道,一比吓一条.erlang写的代码执行时间花了55秒左右,同事们有的用java,有的用C,还有的用C++,用C最快一个老兄只花了2.6秒,用java的也只用了3.2秒.相比之下erlang的代码,真是一头大蜗牛,太慢了. 但是我想实际**一下,别的都不测,先**一下用erlang遍历完一个1.1G的文本到底要花多久(只遍历

《Linux系统编程(第2版)》——2.2 通过read()读文件

2.2 通过read()读文件 前面讨论了如何打开文件,现在一起来看如何读文件.在接下来的一节中,我们将讨论写操作. 最基础.最常见的读取文件机制是调用read(),该系统调用在POSIX.1中定义如下: 每次调用read()函数,会从fd指向的文件的当前偏移开始读取len字节到buf所指向的内存中.执行成功时,返回写入buf中的字节数:出错时,返回-1,并设置errno值.fd的文件位置指针会向前移动,移动的长度由读取到的字节数决定.如果fd所指向的对象不支持seek操作(比如字符设备文件),

PHP使用feof()函数读文件的方法_php技巧

本文实例讲述了PHP使用feof()函数读文件的方法.分享给大家供大家参考.具体用法如下: feof应用于PHP 4, PHP 5 -用来测试文件指针是否到了文件结束的位置. 如果服务器没有关闭由 fsockopen() 所打开的连接,feof() 会一直等待直到超时而返回TRUE.默认的超时限制是 60 秒,可以使用 stream_set_timeout() 来改变这个值. 文件指针必须是有效的,必须指向由 fopen() 或fsockopen() 成功打开的文件(并还未由fclose() 关

HDFS读文件过程分析:获取文件对应的Block列表

在使用Java读取一个文件系统中的一个文件时,我们会首先构造一个DataInputStream对象,然后就能够从文件中读取数据.对于存储在HDFS上的文件,也对应着类似的工具类,但是底层的实现逻辑却是非常不同的.我们先从使用DFSClient.DFSDataInputStream类来读取HDFS上一个文件的一段代码来看,如下所示: 01 package org.shirdrn.hadoop.hdfs; 02 03 import java.io.BufferedReader; 04 import

c#写怎么防止并发操作(一个要删文件,一个要读文件)?

问题描述 c#写怎么防止并发操作(一个要删文件,一个要读文件)? c#写web后台文件和数据库操作,怎么防止并发操作(一个要删文件,一个要读文件)? 解决方案 你读文件的时候指定FileShare.Read,你删除的时候就会收到一个异常,不允许删除. 你在读文件的时候除非读完,不要Close文件,就可以了. https://msdn.microsoft.com/zh-cn/library/system.io.fileshare(VS.80).aspx

java读文件后的数据怎么写到一个数组中 数据格式如下

问题描述 java读文件后的数据怎么写到一个数组中 数据格式如下 解决方案 简单的写了一下,希望对你有帮助: public class Test { // 数组列数 private static final int COLUMN_COUNT = 3; public static void main(String[] args) { BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(new F

qt-QT读文件中的指定行,且将每行中的数据保存到数组里

问题描述 QT读文件中的指定行,且将每行中的数据保存到数组里 QT读文件中的指定行,前六行不要,从第七行开始,且将每行中的两个数分别保存到两个数组里,读到有一行的第一个不为数字而是 '这个标志结束.把读出来的两个数组显示到Textedit上.求详细代码.

Java多种方式读文件,追加文件内容,等对文件的各种操作

一.多种方式读文件内容. 1.按字节读取文件内容 2.按字符读取文件内容 3.按行读取文件内容 4.随机读取文件内容 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStre

用stream读文件

stream|stream 前几天要写一个东西里面有用到读文件的. 可是我不想用FSO,我怕有的空间不支持.可是网络上找了半天没有找到一个不是用FSO写的. 还是自己做了一个. 我记得以前在做无组件上传,并保存文件的时候有用到stream我发现有一个LoadFromFile的方法.可以读取文件.下面是我的代码. function readfile(URL,chartype) set srmObj = server.CreateObject("adodb.stream") srmObj.