Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для cpp_job
4 / 4 / 1
Регистрация: 25.11.2013
Сообщений: 108

Как при достижении определенного размера файла закрыть его

14.10.2015, 00:19. Показов 1811. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброй ночи!

Сново я со своими вопросами....

Есть вечный цикл. Он себе работает и заполняет файлик букафками "а". Хочу при достижении определенного размера закрыть его.

Немного погуглил и узнал, как узнать размер файла.
Вот кодесс.
C++
1
2
3
fin.seekg(0, std::ios::end);
size = fin.tellg();
fin.seekg(0, std::ios::beg);
Ну и выдает мне он размер файла, все как надо.

Потом я начал из него делать порнографию и приручивать в цикл.... Совал его туда сюда... Ну и ничего не вышло(((

Вот мои извращения
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <fstream>
#include <iostream>
#include <conio.h>
 
using namespace std;
 
int main()
{
    ifstream fin;
    ofstream fout;
 
    int size = 0;
 
    fout.open("test_size.txt");
    fin.open("test_size.txt");
    
    for (;;)
    {
        fout << "a\n";
 
        fin.seekg(0, std::ios::end);
        size = fin.tellg();
        if (size == 1024)
        {
            fout.close();
            break; break;
        }
        fin.seekg(0, std::ios::beg);
 
        
    }
 
    
    fin.close();
    _getch();
    return 0;
}
Щастья, здоровья тому, кто поможет или намикнет куда двигаться.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.10.2015, 00:19
Ответы с готовыми решениями:

Как при достижении определенного размера файла закрыть его
Здравствуйте форумчане,столкнулся с такой проблемой. Нужно чтоб после заполнения файла(2Гб обьем максимальный этого файла) закрывался он...

Ошибка при достижении размера файла 2 Г
Добрый день. Извиняюсь если что не так. Имеется база размер файла 312 Мб. При обработке одной из таблиц на 750000 записей проходит...

Сигнал при достижении определенного времени
Доброе время суток. Есть программа, в которой задается начало урока. Допустим 8 часов, 30 минут(Все в отдельных переменных, int). Так...

12
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
14.10.2015, 07:48
Что-то Вы на пустом месте проблему создали
C++
1
2
3
4
5
6
7
8
9
10
11
int size=0;
for (;;)
{
        fout << "a\n";
        size+=strlen( "a\n");
        if (size == 1024)
        {
            fout.close();
            break;
        }
}
1
 Аватар для cpp_job
4 / 4 / 1
Регистрация: 25.11.2013
Сообщений: 108
14.10.2015, 09:18  [ТС]
Да спасибо!
Хотелось бы узнать почему размер файла точно не равен 1КБ?
На выходе выхоит 1,50 КБ (1536 байт), почему не 1024 байта?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.10.2015, 09:24
Цитата Сообщение от cpp_job Посмотреть сообщение
Хотелось бы узнать почему размер файла точно не равен 1КБ?
Думаю, что из-за этого Fstream пишет 13 вместо 10
strlen считает, что символов два, он не знает, что реально в файл их попадёт три
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
14.10.2015, 09:32
Цитата Сообщение от cpp_job Посмотреть сообщение
На выходе выхоит 1,50 КБ (1536 байт), почему не 1024 байта?
Цитата Сообщение от Evg Посмотреть сообщение
strlen считает, что символов два, он не знает, что реально в файл их попадёт три
открой файл в бинарном режиме и тогда \n не будет транслироваться в \n\r
0
 Аватар для cpp_job
4 / 4 / 1
Регистрация: 25.11.2013
Сообщений: 108
14.10.2015, 09:44  [ТС]
Да, если открыть в бинарном жежиме, то будеет ровно 1024.
Мб просто к strlen добавлять единицу(size += strlen("a\n")+1;)? Только эта конструкция провоцирует вечный цикл, ибо при делении на 3 выходит не целое число, а на два выходит ровно 512 итераций.
Как подправить эту шляпу?

Добавлено через 1 минуту
А, блин..туплю..больше или равенствует надо добавить

Добавлено через 2 минуты
Все пашет
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <fstream>
#include <iostream>
#include <conio.h>
 
using namespace std;
 
 
 
int main()
{
    ofstream fout;
 
    int size = 0;
 
    fout.open("test_size.txt");
 
    
    for (;;)
    {
        fout << "a\n";
 
        size += strlen("a\n")+1;
        if (size == pow(2, 5) || size > pow(2, 5))
        {
            cout << "Good!!!";
            fout.close();
            break;
        }
 
        
    }
 
 
    _getch();
    return 0;
}
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.10.2015, 15:04
Цитата Сообщение от cpp_job Посмотреть сообщение
Все пашет
В итоге родился классический гавнокод, который будет работать на машине афтора, но не факт, что будетработать в других местах. Потому что вместо того, чтобы вникнуть в проблему и осознать, афтор решил побыстрее как-то проблему затоптать
0
 Аватар для cpp_job
4 / 4 / 1
Регистрация: 25.11.2013
Сообщений: 108
14.10.2015, 16:29  [ТС]
Ок, тогда такое юзать не буду.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.10.2015, 16:38
В посте #5 написано, что надо делать. В ссылке из поста #4 написано как конкретно делать
0
 Аватар для cpp_job
4 / 4 / 1
Регистрация: 25.11.2013
Сообщений: 108
14.10.2015, 18:18  [ТС]
Применил ваше решение, работает.
Только почему блокнот показывает символы в одну строкуи для того чтобы перейти на символ дальше нужно нажать стрелку вправо не 1 раз, а 2?

Не по теме:

Извиняюсь за глупые вопросы

Миниатюры
Как при достижении определенного размера файла закрыть его  
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.10.2015, 18:33
Лучший ответ Сообщение было отмечено cpp_job как решение

Решение

Цитата Сообщение от cpp_job Посмотреть сообщение
олько почему блокнот показывает символы в одну строку
Потому что в качестве перевода строки он ожидает два символа "\r\n", а не один. Ты можешь в исходнике заменить "a\n" на "a\r\n". В итоге у тебя будет код, которые везде будет работать одинаково и результат такого кода сможет сожрать блокнот, но, возможно, будут проблемы с какими-нибудь убогими допотопными редакторами под юниксами

Просто есть фундаментальное различие между энтерами в разных системах и с этим приходится считаться. Если уж сделать совсем красивый вариант, то можно работать так. Открываем промежуточный файл в текстовом режиме и записываем туда единственный символ "\n". После чего файл закрываем, открываем в бинарном режиме, и считываем оттуда данные в буффер. Таким образом, мы "на ходу" определили, каким образом работает перенос строки на данной системе. Далее файл с результатом открываем в бинарном режиме и в тех местах, где нужно воткнуть перенос строки, втыкаем данные из буффера. Либо просто на основании содержимого буфера понимаем, как нужно правильно считать символы \n при подсчёте количества символов в строке. Но нужно ли тебе так заморачиваться - вопрос. Мне кажется, что варианта из предыдущего абзаца вполне достаточно
0
 Аватар для cpp_job
4 / 4 / 1
Регистрация: 25.11.2013
Сообщений: 108
14.10.2015, 19:01  [ТС]

Не по теме:

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



Добавлено через 27 минут
Думаю да, вы правы на счет заморочек. И правда зачем? Сейчас у нас жесткие диски не на 40МБ же.
Но меня немного смущяет, что файл, который должен выходить 1Гб весит 1,5Гб. Все таки заююзаю ваш способ, хочется узнать что выйдет.

Не по теме:

Вопрос новичка.
Говнокод это тот код который скрывает только видимую проблему, а не решает ее?

0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.10.2015, 20:11

Не по теме:

Цитата Сообщение от cpp_job Посмотреть сообщение
Говнокод это тот код который скрывает только видимую проблему, а не решает ее?
В данном случае - именно так



Добавлено через 5 минут
Цитата Сообщение от cpp_job Посмотреть сообщение
И правда зачем? Сейчас у нас жесткие диски не на 40МБ же
Да не, заморочки связаны вовсе не с экономией памяти. Почти для любой программы хочется, чтобы она работала одинаково на разных платформах. С точки зрения редактора, который просматривает файл, программы, работающие на windows и linux и генерирующие файлы разного размера, они всё=таки работают одинаково, потому что внутри редактора текст будет выглядеть одинаково. Но сюда вклинивается необходимость ограничить размер файла. Т.е. как только мы вводим лимит на размер файла, мы начинаем понимать, что редакторы на разных системах будут видеть разный текст файлах (условно говоря на одной системе будет 1000 строк текста, а на другой 666). Т.е. нужно для начала понять, что конкретно будет главным критерием одинаковости. Конкретно в данном случае лично на мой взгляд кажется, что "одинаковым" поведением будет одинаковый результирующий файл. "Нормальные" редакторы сумеют съесть файл с любым способом переноса строк на любой системе. Всякие убогие редакторы типа блокнота - нет. Т.е. как ни крути, но кто-то всегда будет в проигрыше. И лично моё мнение заключается в том, что проще всего пожертвовать убогими редакторами под юниксами
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.10.2015, 20:11
Помогаю со студенческими работами здесь

Остановка таймера при достижении определенного времени
вообщем реализовываю таймер и столкнулся с проблемсом мне нужно что бы в if как только таймер достиг определенного времени он остановился...

Настройка оповещения при достижении таймером определенного момента
Доброго времени суток, коллеги. Есть некая форма, в которой есть 2 лейбла, кнопка и таймер. Таймер выглядит так DateTime time = new...

Выделение строк цветом,при достижении определенного времени до даты
Здравствуйте,Уважаемые знатоки. Такой вопрос,каким образом можно реализовать следующую,так сказать,вещь: Имеем таблицу, один столбец...

Как закрыть свою программу при запуске определенного процесса?
Нужно чтобы при запуске определенного процесса, закрывалась моя программа. То есть у меня запущено мое приложение, если запускается...

Авто перенос курсора в Richedit при достижении длины строки определенного числа символов.
Вопрос - как в RichEdit эмулировать нажатие клавиши enter или просто осуществить перенос каретки при достижении длины строки 18 символов?


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru