Форум программистов, компьютерный форум CyberForum.ru

Почему перестала работать запись в файл? - C++

Восстановить пароль Регистрация
 
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
09.05.2013, 16:42     Почему перестала работать запись в файл? #1
Почему перестала работать запись в файл?
C++
#include <cstdio>
#include <cstring>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
 
int main()
{
    char c;
    ifstream in;
    ofstream out;
    vector <char> a;
 
    in.open("file.txt", ifstream::in);
    out.open("index.htm", ofstream::out | ofstream::app);
 
 
    string s = "\n"
        "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"
        "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ru\" lang=\"ru\">\n"
        "<head>\n"
        "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n"
        "<title>index</title>\n"
        "<style>\n"
        "body   { font:9pt sans; padding:0px; margin:0px; line-height:18pt; background:#eee; color:#000; }\n"
        "</style>\n"
        "</head>\n"
        "<body>\n";
    out.write(s.c_str(), s.size());
 
 
    // цикл забивает массив 'a' символами из текстового файла
    while(in.good())
    {
        c = in.get(); // чтение символа
 
        if(c=='\n') // меняет на "<br>"
        {
            a.push_back('<');
            a.push_back('b');
            a.push_back('r');
            a.push_back('>');                                   
        }
        else if(c=='<') // меняет на "& # 6 0 ;"
        {
            a.push_back('&');                                   
            a.push_back('#');                                   
            a.push_back('6');                                   
            a.push_back('0');                                   
            a.push_back(';');                                   
            
        }
        else if(c=='>') // меняет на "& # 6 2 ;"
        {
            a.push_back('&');                                   
            a.push_back('#');                                   
            a.push_back('6');                                   
            a.push_back('2');                                   
            a.push_back(';');
        }
        else { a.push_back(c); } // иначе забиваем остальными символами
    }
 
    // массив в строку, а строку в файл
    string str(a.begin(), a.end()-1);
    out.write(str.c_str(), a.size());
    
    /*** ДАЛЬШЕ НЕ РАБОТАЕТ! ПОЧЕМУ? ***/
 
    string e = "</body>\n</html>";  
    out.write(e.c_str(), e.size());
 
    
    in.close();
    out.close();
 
    return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2013, 16:42     Почему перестала работать запись в файл?
Посмотрите здесь:

C++ Немного изменил код программы и она перестала работать. Не пойму почему.
C++ Почему запись int в файл происходит в обратном порядке?
Программа для поиска седловых точек матрицы перестала работать после добавления функции ввода C++
В VS2010 перестала работать вкладка "Проект" C++
[Файлы] Запись-чтение-запись. Почему не прокатывает? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
09.05.2013, 16:53     Почему перестала работать запись в файл? #2
C++
1
2
3
    // массив в строку, а строку в файл
    string str(a.begin(), a.end()-1);  //<----- Подумайте над этим
    out.write(str.c_str(), a.size());
И еще можно писать так
C++
1
&array[0]
Вместо дополнительной строки.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
09.05.2013, 17:11     Почему перестала работать запись в файл? #3
А подумать? Я же указал где)
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
09.05.2013, 17:30     Почему перестала работать запись в файл? #4
Да, там должно быть: string str( a.begin(), a.end() );
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
09.05.2013, 17:32     Почему перестала работать запись в файл? #5
Близко но не совсем. Вернее можно но не красиво.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
09.05.2013, 17:48  [ТС]     Почему перестала работать запись в файл? #6
Я сейчас нечаянно развею тут вашу повисшую в воздухе ауру загадочности -- программа работает, все дело во входном файле, который я использую, а почему программа с ним не работает не понятно, может быть какая-нибудь сигнатура в файле сбивает программу или размер файла слишком большой...

Добавлено через 1 минуту
Цитата Сообщение от stima Посмотреть сообщение
string str(a.begin(), a.end()-1); //<----- Подумайте над этим
Нечего здесь думать, просто копирует на один символ меньше.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
09.05.2013, 17:50     Почему перестала работать запись в файл? #7
Цитата Сообщение от programina Посмотреть сообщение
Нечего здесь думать, просто копирует на один символ меньше.
Вы уверены?))) Что будет если файл пустой? Каков результат a.end() - 1?

п.с. А я добавлю загадочности что если в файле кодировка не ASCII?
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
09.05.2013, 18:07  [ТС]     Почему перестала работать запись в файл? #8
Цитата Сообщение от stima Посмотреть сообщение
Вы уверены?))) Что будет если файл пустой? Каков результат a.end() - 1?

п.с. А я добавлю загадочности что если в файле кодировка не ASCII?
Так в том дело, что у меня кодировка CP1251

-1 удаляет мусор после цикла while

У меня еще беда с текстовыми редакторами, они не показывают файл полностью
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
09.05.2013, 18:12     Почему перестала работать запись в файл? #9
Цитата Сообщение от programina Посмотреть сообщение
п.с. А я добавлю загадочности что если в файле кодировка не ASCII?
Так в том дело, что у меня кодировка CP1251
Это одно и тоже. Даже больше скажу у Вас не будет ошибки в std::vector<char> из-за обычного переполнения char.
Вы не пользуетесь дебаггером, жаль), и думать не хотите, вообще печаль)).

закоментируйте это
C++
1
2
3
    // массив в строку, а строку в файл
    string str(a.begin(), a.end()-1);
    out.write(str.c_str(), a.size());
и добавте это
C++
1
cout << "vector count" << a.size() << endl;
и посмотрите на результат.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
09.05.2013, 18:21  [ТС]     Почему перестала работать запись в файл? #10
Цитата Сообщение от stima Посмотреть сообщение
закоментируйте это
C++
1
2
3
    // массив в строку, а строку в файл
    string str(a.begin(), a.end()-1);
    out.write(str.c_str(), a.size());
и добавте это
C++
1
cout << "vector count" << a.size() << endl;
и посмотрите на результат.
Кол-во символов?
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
09.05.2013, 18:22     Почему перестала работать запись в файл? #11
Сколько?)
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
09.05.2013, 18:36  [ТС]     Почему перестала работать запись в файл? #12
Цитата Сообщение от stima Посмотреть сообщение
Сколько?)
Если входной файл выглядит так:

Код
123
456
789
Тогда 18

Добавлено через 3 минуты
Это когда конец строки линуксовый, а когда виндовсный то не 18, а 25

Добавлено через 2 минуты
В Unicode тоже 18

Добавлено через 1 минуту
Если смотреть через просмотрщик firefox то после 9 видно какую-то крякозябру.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
09.05.2013, 18:40     Почему перестала работать запись в файл? #13
В Вашем случае оно будет работать как при ASCSII так и при UTF-8.
Вопрос. Что в index.html? Я скомпилил и запустил у меня все работатет.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
09.05.2013, 18:49  [ТС]     Почему перестала работать запись в файл? #14
Цитата Сообщение от stima Посмотреть сообщение
В Вашем случае оно будет работать как при ASCSII так и при UTF-8.
Вопрос. Что в index.html? Я скомпилил и запустил у меня все работатет.
В текстовом редакторе:
HTML5
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>index</title>
<style>
body    { font:9pt sans; padding:0px; margin:0px; line-height:18pt; background:#eee; color:#000; }
</style>
</head>
<body>
123
<br>456
<br>789
<br>
В просмотрщике исходного кода firefox:
HTML5
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>index</title>
<style>
body    { font:9pt sans; padding:0px; margin:0px; line-height:18pt; background:#eee; color:#000; }
</style>
</head>
<body>
123
<br>456
<br>789
<br>
</body>
</html>
Добавлено через 52 секунды
В текстовом редакторе видно что запись обрывается.

Добавлено через 5 минут
Сейчас попробую в виндовсе скомпилировать.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
09.05.2013, 18:59     Почему перестала работать запись в файл? #15
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Уууу я понял теперь что Вы хотите. Почитайте
{ссылка удалена}

или просо погуглите про перенос строки на разных платформах('\r\n' Win, '\n' Unix) и браузерах. И откройте ваш исходный файл так чтобы он показывал все спрятанные символы, я думаю там идте '\r\n' Вы убераете \n а браузеры обрабатывают оствшийся \r
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
09.05.2013, 19:09  [ТС]     Почему перестала работать запись в файл? #16
Цитата Сообщение от stima Посмотреть сообщение
Уууу я понял теперь что Вы хотите. Почитайте
{ссылка удалена}

или просо погуглите про перенос строки на разных платформах('\r\n' Win, '\n' Unix) и браузерах. И откройте ваш исходный файл так чтобы он показывал все спрятанные символы, я думаю там идте '\r\n' Вы убераете \n а браузеры обрабатывают оствшийся \r
Действительно, проверила на виндовсе, все работает замечательно.

Добавлено через 1 минуту
stima, извините за нервотрепку
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
10.05.2013, 11:41     Почему перестала работать запись в файл? #17
Мне одному кажется, что такую программу проще написать на Си?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2013, 12:33     Почему перестала работать запись в файл?
Еще ссылки по теме:

Почему не происходит запись в файл? C++
C++ Логические выражения - программа на следующий день просто перестала работать
C++ Почему неправильно идет запись в файл?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.05.2013, 12:33  [ТС]     Почему перестала работать запись в файл? #18
Решила проблему добавлением a.pop_back(); для удаления последнего элемента массива. Все стало работать как надо
C++
            // ...
            a.push_back('2');                                   
            a.push_back(';');
        }
        else { a.push_back(c); } // иначе забиваем остальными символами
    }
 
    a.pop_back(); // ЗДЕСЬ !
 
    // массив в строку, а строку в файл
    string str(a.begin(), a.end()); // удалила единицу
    out.write(str.c_str(), a.size());
 
    string e = "\n</body>\n</html>";  
    out.write(e.c_str(), e.size());
 
    in.close();
    out.close();
 
    return 0;
}
Yandex
Объявления
11.05.2013, 12:33     Почему перестала работать запись в файл?
Ответ Создать тему
Опции темы

Текущее время: 08:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru