C++中关于读到文件结尾的问题

voidreadCodeFile(){ifstreaminf;ofstreamoutf;intw[200],c=0;chars[200];stringcode;HuffT... void readCodeFile()
{
ifstream inf;
ofstream outf;
int w[200], c = 0;
char s[200];
string code;
HuffTree<char> *TreeArray[100];
HuffNode<char>* 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为真,导致读文件结束了 这是怎么回事啊?
展开
 我来答
碧血玉叶花
推荐于2016-04-21 · TA获得超过4976个赞
知道大有可为答主
回答量:6154
采纳率:0%
帮助的人:1721万
展开全部
c++里面用file.eof()来控制循环的做法,是一个不好的行为。 因为它是一种后知后觉的方式, 也就是说如果文件没有打开, 或者文件个格式有问题, 比如尾部都多出个空格, 由于file.eof()只是检测标记, 而上述情况,标记没有被设置, 因此就会继续执行。

解决的方法有很多, 比如先读一下, while (getline(...)) {....} , 按你的情况, 其实应该在ReadGroup()里面作检测, 如果不愿意修改ReadGroup(), 有一个代价最小的做法:
//前提, 你的file是ifstrem的。

std:string line;

while (file >> line)
{
file.push_back(line);

ReadGroup();
....

}

说实话, 对循环读这种方式, 尽量做到每次读多少个字节。 然后比较具体读出的字节数, 和期待值作比较, 就能发现问题。 即便要读到一个数据结构里面, C++的方式, 也应该封装到class里, 重载<<或>>。
追问
我现在把ios::in 改成了 ios::binary  发现呢解压完了  但是丢失了换行符
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式