简单的C ++写入文件:没有写入!应该很容易,但我很难过

时间:2010-06-29 10:12:06

标签: c++ string filestream io

非常感谢你帮助我!每个人都如此快速和优秀!再次感谢!

在测试此代码后,发生的事情是没有数据写入我的文件。只出现一个0。

我做错了什么?

void CreateHtmlFile(string myMessages[])
{
  int i = 0;
  int emptyarray = 0;
  int myEmptyCounter = 0;
  int emptyArrayCounter = 0;
  string myEmpty;
  ofstream myfile;

  myfile.open ("C:\\Users\\Andrews\\Documents\\Visual Studio 2010\\Projects\\computerclass\\Debug\\outages.htm", ios::out);
   if(!myfile) // is there any error?
    {
       cout << "Error opening the file! Aborting…\n";
       exit(1);
    }
  myfile << "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>\n";
  myfile << "<html>\n";
  myfile << "<head>\n";
  myfile << "<title>Livermore Readerboard</title>\n";
  myfile << "<style type='text/css'>\n";
  myfile << "table {font-family:Helvetica Narrow, sans-serif;font-size:42px;}\n";
  myfile << "body\n";
  myfile << "{\n";
  myfile << "text-align: center;\n";
  myfile << "background: #000000;\n";
  myfile << "color:#00FF00;\n";
  myfile << "}\n";
  myfile << "#container\n";
  myfile << "{\n";
  myfile << "margin-left: auto;\n";
  myfile << "margin-right: auto;\n";
  myfile << "width: 93em;\n";
  myfile << "text-align: left;\n";
  myfile << "</style>\n";
  myfile << "<META HTTP-EQUIV= \"refresh\" content= \"5;URL=readerboard.htm\">\n";
  myfile << "</head>\n";
  myfile << "<body>\n";
  myfile << "<div id='container'>\n";
  myfile << "<table class='Design6' border=1 cellpading=1 cellspacing=0>\n";

  myEmpty.clear();
while (i != 10)
{
       if (myMessages[i] != "")
       {
       myfile << "<tr>\n";
       myfile << "<td><b>" << myMessages[i] << "</b></td>\n";
       myfile << "</tr>\n";
       i++;
       }
       else
       {
              i++;
              emptyArrayCounter++;
       }
}

if (emptyArrayCounter == 9)
{
       //empty array so insert default message
       myfile << "<tr>\n";
       myfile << "<td><b>" << "No Outages" << "</b></td>\n";
       myfile << "</tr>\n";
}

  myfile << "</div>\n";
  myfile << "</body>\n";
  myfile << "</html>\n";

  myfile.close();
}

4 个答案:

答案 0 :(得分:3)

[编辑]需要明确的flush()调用是我在旧的,破碎的,预标准的编译器(如MSVC 6和十多年前的早期版本)中遇到的问题。它可能不再需要,显然是有问题的库实现的解决方法。

我已经尝试了代码(删除部分输出消息并将输出文件名重命名为我系统上的某些内容)。输出是正确的。

可能值得尝试写一个本地文件,看看会发生什么。您已经检查无法打开文件流以进行输出,但是您的案例似乎有些奇怪。

[编辑:我可能会因为多管闲事而被投票赞成但是......]你在定义范围顶部定义所有变量的C风格习惯已经过时了。考虑定义变量的时间早于它们可以正确初始化并且范围更有限的地方。它现在可能不是什么大问题,但如果您曾经在任何合理规模的C系统上工作并遇到您的第一个未初始化的变量错误,那么您将开始鄙视它。每个人都有权享受他们的个人喜好,但客观地说,一种促进错误的风格是次等的。

答案 1 :(得分:3)

尝试一些测试:

  • 如果您将输出发送到stdout而不是文件,会发生什么?
  • 如果您使用其他文件路径会发生什么,例如"C:\\out.htm"
  • 如果在文件不存在时运行,会发生什么?如果在运行程序之前手动创建(空)输出文件呢?
  • 如果您将程序简化为简单的openmyfile << "test";close会怎样?
  • 如果您尝试使用C风格的文件I / O(fopen,fprintf,fclose)而不是流来运行程序的删节版本,会发生什么?

答案 2 :(得分:1)

使用VS 2005,我的机器上的代码运行正常。此表达式出错:

myMessages[i] != ""

转换为

myMessages[i].empty() 

哪个更好,因为你正在使用字符串库,并且方法是检查字符串是否为空,为什么不使用它。

答案 3 :(得分:-1)

要检查未打开的流,请使用:

if (myfile.bad())

其余的看起来很好,只是文件路径错误,或者无法创建文件。