Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
1

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

09.05.2013, 16:42. Показов 1243. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Почему перестала работать запись в файл?
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;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.05.2013, 16:42
Ответы с готовыми решениями:

Почему перестала работать Nvidia 9500 GT
Почему перестала работать видеокарта Nividia Geforce 9500 Gt она до этого работала и в одно...

Немного изменил код программы и она перестала работать. Не пойму почему.
Программа работала, но нужно было вынести вывод суммы в main( до этого выводилась в sum). Для этого...

Перестала работать дозапись в файл
Написал программу. Открыл ее через 3 недели и обнаружил,что не работает дозапись в файл. В чем...

Перестала работать программа, не могу даже запустить файл .dpr
Есть программа на delphi запускаю ее и выдает ошибку, попробовал запустить исходник программы, она...

17
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
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]
Вместо дополнительной строки.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
09.05.2013, 17:11 3
А подумать? Я же указал где)
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
09.05.2013, 17:30 4
Да, там должно быть: string str( a.begin(), a.end() );
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
09.05.2013, 17:32 5
Близко но не совсем. Вернее можно но не красиво.
0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
09.05.2013, 17:48  [ТС] 6
Я сейчас нечаянно развею тут вашу повисшую в воздухе ауру загадочности -- программа работает, все дело во входном файле, который я использую, а почему программа с ним не работает не понятно, может быть какая-нибудь сигнатура в файле сбивает программу или размер файла слишком большой...

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

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

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

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

У меня еще беда с текстовыми редакторами, они не показывают файл полностью
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
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;
и посмотрите на результат.
0
2062 / 618 / 41
Регистрация: 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;
и посмотрите на результат.
Кол-во символов?
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
09.05.2013, 18:22 11
Сколько?)
0
2062 / 618 / 41
Регистрация: 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 видно какую-то крякозябру.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
09.05.2013, 18:40 13
В Вашем случае оно будет работать как при ASCSII так и при UTF-8.
Вопрос. Что в index.html? Я скомпилил и запустил у меня все работатет.
0
2062 / 618 / 41
Регистрация: 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 минут
Сейчас попробую в виндовсе скомпилировать.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
09.05.2013, 18:59 15
Лучший ответ Сообщение было отмечено как решение

Решение

Уууу я понял теперь что Вы хотите. Почитайте
{ссылка удалена}

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

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

Добавлено через 1 минуту
stima, извините за нервотрепку
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
10.05.2013, 11:41 17
Мне одному кажется, что такую программу проще написать на Си?
0
2062 / 618 / 41
Регистрация: 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;
}
0
11.05.2013, 12:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.05.2013, 12:33
Помогаю со студенческими работами здесь

Почему не создаётся файл и не производится запись в пустой файл?
Помогите разобраться почему не создаётся файл и не производится запись в пустой файл, в дебагере...

Открытие, чтение и запись в файл, но работать в браузере:)
Обалдели когда название прочитали?:) Сам в шоке:) В общем, ребята, помогите?:) Задача:...

Почему не происходит запись в файл?
#include&lt;iostream&gt; #include&lt;fstream&gt; #include &lt;string&gt; using namespace std; int main() {...

Почему не происходит запись в файл?
программа отрабатывает, в файл не выводит значения. program Project1; {$APPTYPE CONSOLE} ...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru