【问题标题】:C++ filestream problemC++文件流问题
【发布时间】:2011-04-24 18:13:50
【问题描述】:

我正在用 C++ 制作一个简单的游戏,我希望将游戏结束时的最高分写入文本文件。我正在使用 fstream 首先读取最后保存的高分并将其与新的高分进行比较。文本文件中的输出看起来像这样(0НН),它不应该。我对此感到非常沮丧。 这是我的代码的一部分。

double score_num=0;
fstream datafile("score.pon"); //Declaration of variables

...

if(SPEED>score_num)
{
     score_num=SPEED;
}
//getting the score

...

datafile<<score_num; //Writing it to the file

【问题讨论】:

  • 你在哪里阅读以前的分数?文件中包含什么内容以及您希望文件中包含什么内容?
  • sample code 不完整。请这样做(同时保持简洁)。
  • @dominic-hamon 读取文件的内容,但文件中没有写入任何内容@outis 这些是我用来读取(datafile>>score_num)并写入文件的行,其他无关紧要。
  • 不相关的行可以省略,但示例代码至少应为compile。更新问题中的代码,而不是通过 cmets。当其他人尝试填写代码时,他们可能不会犯与您相同的错误(尽管他们可能会犯其他错误)。
  • @outis - 是的,我知道我是新手,但我会尝试。感谢您的建议!

标签: c++ filestream


【解决方案1】:
#include <iostream>
#include <fstream>

using namespace std;
#define SPEED 12

int main()
{
    double score_num=0;
    ofstream datafile("score.pon"); //Declaration of variables


    if(SPEED>score_num)
    {
        score_num=SPEED;
    }
    //getting the score

    datafile<<score_num; //Writing it to the file
    return 0;
}

将 fstream 替换为 ofstream 就像一个魅力。也许您应该显示更多代码?另外,关闭文件是个好习惯:

datafile.flush();
datafile.close();

我会把错误处理留给你

【讨论】:

  • ofstream 不起作用,因为我必须先从文件中读取高分并将其与缓冲区中的分数进行比较
  • 如果我错了请纠正我,但我很确定关闭流也会隐式刷新它。
  • @kisplit:我认为这取决于(我的 C++ 内存在这里很草率)。我想这取决于使用的流类,以及缓冲区是拥有还是共享等。
  • @Martin:你打算覆盖文件吗?在那种情况下,你在哪里做seekp(0)
  • @Martin: flushing and closing a file stream 不应该是必需的(library stream buffer destructorclose writing all pending output 之后的文件)。如果它有效,它可能只是间接地解决了这个问题(如果你发布了完整的示例代码,我们可以告诉你)。
【解决方案2】:

Hacky 解决方案 - 作为 ifstream 打开文件,读取现有值,关闭它,调整分数,作为 ofstream 打开文件,写入分数,关闭它。或者,研究 seekp() 函数的使用,并将分数写为二进制值,而不是文本。

【讨论】:

    【解决方案3】:

    我对原版失败原因的最佳猜测是,当您从文件中读取最后一个字符时,EOF bit 已设置。在这种状态下,所有的读写操作都会失败。您可以通过首先调用clear 来写入已结束的文件流。

    // the following doesn't truncate file, or handle other error conditions.
    if (datafile.eof()) {
        datafile.clear();
    }
    datafile.seekp(0, std::ios_base::beg);
    datafile << score_num;
    

    但是,这并不能解决您的所有问题。如果您对文件的写入少于其当前长度(例如,旧的高分是“1.5”,新的高分是“2”),部分旧数据仍将出现在文件末尾。只要分数没有小数部分(在这种情况下,您可能应该使用整数类型,例如unsigned long),您就不会注意到这个错误,因为 a ftruncate)。

    【讨论】:

    • 今天早上我想知道为什么这些修复有时只起作用。即我的分数是 9.1,而我的分数是 9.7,但它没有记录下来。所以我在写入文件之前添加了 datafile.clear() ,我希望不要再遇到麻烦了!谢谢!
    • @Martin:请注意,在写入正确处理错误之前,您应该做的不仅仅是调用clear,因为文件流可能处于其他会导致写入失败的错误状态。查看更新。
    猜你喜欢
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 2020-04-30
    • 1970-01-01
    相关资源
    最近更新 更多