|
Вопрос # 4 718/ вопрос открыт / |
|
Здравствуйте, эксперты! Мне нужно создать файл в пол гига, забитый нулями. Нашёл фрагмент кода, написанный на C++, но он не работает. Подскажите пожалуйста, как сделать его полноценной программой? Код прилагается.
Приложение: Переключить в обычный режим- #include <fstream>
- <...>
- FILE *fat_file;
- fat_file=fopen("C:\\TESTFILE","a+");
- for (int t=0; t<=(1024*1024*500); t++) {
- fputs("0",fat_file);
- }
- fclose(fat_file);
-
-
 |
Вопрос задал: Sergey1980 (статус: Посетитель)
Вопрос отправлен: 10 ноября 2010, 14:51
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: min@y™
Всё готово. Писал на DevC++. Полугиговый файл при таком размере буфера и моих параметрах компа создаётся секунды за 3-4. Вот код:
#include <cstdlib>
#include <iostream>
using namespace std;
#define BufSize 0x00010000 // размер буфера с нулями (например, 64 кб)
#define FileSize 0x20000000 // размер файла (пол-гига)
bool CreateFatFile(char* FileName)
{
unsigned char Buffer[BufSize];
unsigned int Size = 0x00000000, Step = 0;
bool Success = false;
for (int Index = 0; Index != BufSize; Index++)
Buffer[Index] = 0x00;
// создаю файло
FILE *FatFile = fopen(FileName, "w");
Success = (FatFile != 0);
while ((Size < FileSize) && (Success))
{
// запись буфера
Success = fwrite(Buffer, sizeof(Buffer), 1, FatFile) != 0;
Size += BufSize;
// вывод инфы для наблюдения за процессом :)
Step++;
printf("Step %d, Size 0x%08X (%d bytes)\r", Step, Size, Size);
} // while
printf("\n");
// закрываю файло
if (FatFile)
fclose(FatFile);
else Success = false;
return Success;
}
int main(int argc, char *argv[])
{
if (CreateFatFile("FatFile.bin")) printf("File created succesfully.\n");
else printf("File create error.\n");
system("PAUSE");
return EXIT_SUCCESS;
}
Думаю, свои 5 баллов я заслужил. :)
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 10 ноября 2010, 16:02
Оценка за ответ: 5
Комментарий к оценке: Молодец, мне бы так уметь!!!
|
Ответ #2. Отвечает эксперт: Егор
Здравствуйте, Sergey1980!
Другой вариант - воспользоваться функцией fseek, которая позволяет переместить позицию записи в файле.
#include <stdio.h>
#include <conio.h>
long size=512L*1024*1024; // = 0.5 Gb
void main()
{
FILE *f;
f=fopen("C:\\test", "w"); // создали файл
int c=0; // это - "буфер", он нужен для функций записи
fseek(f, size - 1, SEEK_SET); // перемещаем позицию записи на size-1 байт от начала файла
fwrite(&c, 1, 1, f); // записываем из "буфера" c один байт, один раз в файл f
fclose(f); // всё, закрываем файл
getch(); // подождём нажатия на любую клавишу
}
 |
Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 10 ноября 2010, 19:02
|
Мини-форум вопроса
Всего сообщений: 14; последнее сообщение — 11 ноября 2010, 18:46; участников в обсуждении: 5.
|
min@y™ (статус: Доктор наук), 10 ноября 2010, 15:04 [#1]:
А компилятор какой? Уж не 16-битный ли?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 10 ноября 2010, 15:08 [#2]:
А пол-гига - это 10243 / 2 = 536870912, а не 500 * 10242 = 524288000.
Писать по одному байту в файл 537 миллионов раз - этож пипец.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Sergey1980 (статус: Посетитель), 10 ноября 2010, 15:15 [#3]:
Я пользуюсь Dev-Cpp
|
|
Sergey1980 (статус: Посетитель), 10 ноября 2010, 15:20 [#4]:
Вообще-то я полный чайник, min@y™, подскажи пожалуйста, как должен выглядеть код полностью, на твой взгляд.
|
|
min@y™ (статус: Доктор наук), 10 ноября 2010, 15:23 [#5]:
У меня тоже есть DevC++, щас попробую написать.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
AlexMPEI (статус: 1-ый класс), 10 ноября 2010, 15:34 [#6]:
у меня на С Builder 6 тоже не пишет ничего. С виду все штатно, файл создается, поинтер не нулевой. Но ни одной функцией записать не получилось ничего. Удивлен.
Этот код у меня 100% работает в Вижуал студии 2005:
FILE *file;
char* file_name = "C:\\Program Files\\RcService\\Log.txt";
void Log(const char* message)
{
file = fopen( file_name, "a" );
fprintf( file, message);
fclose( file );
}
|
|
min@y™ (статус: Доктор наук), 10 ноября 2010, 16:07 [#7]:
Цитата (Sergey1980):
Вообще-то я полный чайник
Кстати, забыл сказать: я тоже полный чайник в С++. Зато куча справочников на винте держу на всякий случай.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 10 ноября 2010, 16:21 [#8]:
Цитата (Sergey1980):
Комментарий к оценке: Молодец, мне бы так уметь!!!
С++ - это тебе не шахматы, тут думать надо! (©)
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Егор (статус: 10-ый класс), 10 ноября 2010, 19:03 [#9]:
Правда, программа написана не на С++, а на чистом Си.
Но пример в вопросе - тоже не С++.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
min@y™ (статус: Доктор наук), 11 ноября 2010, 08:14 [#10]:
Цитата (Егор):
Другой вариант - воспользоваться функцией fseek, которая позволяет переместить позицию записи в файле.
А ты уверен, что таким образом в файл будут записаны нули?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 11 ноября 2010, 08:15 [#11]:
Цитата (Егор):
Правда, программа написана не на С++, а на чистом Си.
А чем будет отличаться прога на С++?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Егор (статус: 10-ый класс), 11 ноября 2010, 17:31 [#12]:
Цитата (min@y™):
А ты уверен, что таким образом в файл будут записаны нули?
да
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Егор (статус: 10-ый класс), 11 ноября 2010, 18:36 [#13]:
на msdn'е не нашёл, но вот отрывок из man'а (линукс, конечно, не винда, но функция всё же стандартная):
Цитата:
The lseek() function allows the file offset to be set beyond the end of
the existing end-of-file of the file. If data is later written at this
point, subsequent reads of the data in the gap return bytes of zeros
(until data is actually written into the gap).
да, здесь lseek, а не fseek, но fseek является "оболочкой" над системной функцией lseek.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Вадим К (статус: Академик), 11 ноября 2010, 18:46 [#14]:
Нужно только уточнить у вопрошающего, что он имел ввиду под нулями.
Нулями символами (то есть '0') или нулевыми байтами. Разница принципиальная. В предложенных решениях заполняется нулевыми байтами, а у вопрошающего - символами нуля.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|