从显示垃圾的文件中检索的字符串

时间:2015-03-15 02:07:34

标签: c++ string fstream

我有2个文件,easyp.txteasyn.txteasyp.txt存储点,easyn.txt存储名称。我有代码显示最高分和球员名称。它工作正常,然后我编辑了其他一些行,并在再次运行时,它喷出了垃圾。代码如下所示:

case 1:
        infile.open("easyn.txt", ios::out | ios::app);
        ofile.open("easyp.txt", ios::out | ios::app);
        while (getline(infile, STRINGT) && getline(ofile, STRINGO))
        {
            istringstream buffer(STRINGO);
            buffer >> value;
            if (infile.eof() && ofile.eof()){
                printf("The top player for easy is %s with only %i tries!", STRINGD, value);
                break;
            }
            if (value < best)
            {
                STRINGD = STRINGT;
                best = value;
            }
        }
        infile.close();
        ofile.close();
        _getch();
        break;

(较低的点数是更好的顺便说一句)

当我运行程序时,它会输出随机的ascii字符作为玩家名称,并输出1835884884作为分数。

是的我是using namespace std

我有文件读/写的唯一时间如下:

            ofstream myfile;
            myfile.open("easyn.txt", ios::out | ios::app);
            if (myfile.is_open())
            {
                myfile << chName << "\n";
                myfile.close();
            }
            myfile.open("easyp.txt", ios::out | ios::app);
            if (myfile.is_open())
            {
                myfile << iTurns << "\n";
                myfile.close();
            }

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

您的计划的主要问题是:

printf("The top player for easy is %s with only %i tries!", STRINGD, value);

%s的{​​{1}}格式说明符需要printf,而不是char *。您要解决的问题是将std::string替换为STRINGD

将参数传递给函数期望接收的另一种类型的varargs函数会调用未定义的行为。究竟发生了什么取决于你的架构和ABI,所以如果没有这些细节我就无法给出详细的解释,但我认为无论如何都不重要。 :)

答案 1 :(得分:0)

我不知道这是否有帮助,但不使用.txt扩展程序,而是使用.dat扩展程序。也许会有所帮助?

.dat个文件"data files"可以由文本编辑器打开,所以我可能会帮助&gt; _&gt;

并且我尝试不使用ios::out | ios::app,即使你使用它们,你也做错了。如果你想解决这个问题,请点击这里 - &gt; fileStreaming C++ tutorial,主要是因为您在大多数情况下使用ios::out | ios::in

除了while (getline(infile, STRINGT) && getline(ofile, STRINGO))之外你还可以使用其他的东西我永远不会使用它,主要是因为它只是我的偏好。