Простой C ++ Запись в файл: ничего не написано! Должно быть легко, но я в тупике - PullRequest
0 голосов
/ 29 июня 2010

Большое спасибо за помощь!Все так быстро и отлично!Еще раз спасибо!

После того, как я протестировал этот код, в мой файл не записываются данные.Появляется только 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 ]

3 голосов
/ 30 июня 2010

Несколько тестов, чтобы попробовать:

  • Что произойдет, если вы отправите вывод в stdout вместо файла?
  • Что произойдет, если вы используете другой путь к файлу, например "C:\\out.htm"?
  • Что произойдет, если вы запустите это, когда файл не существует? Что если вы вручную создадите (пустой) выходной файл перед запуском программы?
  • Что произойдет, если вы упростите программу до простого open, myfile << "test";, close?
  • Что произойдет, если вы попытаетесь запустить сокращенную версию программы, используя файловый ввод-вывод в стиле C (fopen, fprintf, fclose) вместо потоков?
3 голосов
/ 29 июня 2010

[Edit] Потребность в явных вызовах flush () была тем, с чем я столкнулся со старыми, сломанными, предстандартными компиляторами, такими как MSVC 6 и более ранние, более десяти лет назад.Вероятно, в этом больше нет необходимости, и, очевидно, это был обходной путь для проблемных реализаций библиотеки.

Я опробовал код (удалив раздел для вывода сообщений и переименовав имя выходного файла в мою систему).Вывод был правильным.

Возможно, стоит попытаться записать в локальный файл, просто чтобы посмотреть, что произойдет.Вы уже проверяете, не удалось ли открыть файловый поток для вывода, но в вашем случае происходит что-то странное.

[Редактировать: Я, вероятно, получу отрицательный голос за то, что был любопытнымно ...] Ваши привычки в стиле C определять все переменные в верхней части данной области видимости устарели.Попробуйте определить переменные не раньше, чем там, где они могут быть правильно инициализированы и имеют более ограниченную область видимости.Сейчас это может не иметь большого значения, но если вы когда-нибудь работаете в системе C любого разумного масштаба и столкнетесь с первыми ошибками неинициализированных переменных, вы начнете презирать ее.Каждый имеет право на свои личные предпочтения, но стиль, способствующий ошибкам, объективно, объективно говоря.

1 голос
/ 29 июня 2010

Ваш код работает на моем компьютере с использованием VS 2005. Это выражение выдает ошибку:

myMessages[i] != ""

Преобразовано в

myMessages[i].empty() 

, что лучше, потому что вы используете строкуесть библиотека и метод, чтобы проверить, является ли строка пустой или нет, почему бы не использовать ее.

0 голосов
/ 29 июня 2010

Чтобы проверить поток, который не был открыт, используйте:

if (myfile.bad())

Все остальное выглядит хорошо, просто путь к файлу неверен или файл не может быть создан.

...