Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрая запись в файл 
:(
    Опции темы
3,14
Дата 23.7.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: нет
Всего: 24



Есть такая проблема:
Есть число N (1 <= N <= 1000). Нужно записать в файл такую последовательность:
2 1 4 3 ... (2*N) (2*N - 1)
Лимит по времени 1 сек.
Как ни пытаюсь, выходит что то порядка 1.16 - 1.32 (само число N так же читается из файла).


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
FelikZ
Дата 23.7.2007, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый Маразматик
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 1.12.2006
Где: Vault 13

Репутация: нет
Всего: 5



А как делаешь?


--------------------
user posted image
PM WWW ICQ Skype   Вверх
3,14
Дата 23.7.2007, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: нет
Всего: 24



Как грится, не судите строго, сам не С-ник:

Код

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <iostream.h>
#include <fstream.h>

char fileIn  [] = "file.in";
char fileOut [] = "file.out";

char *readFile(size_t &fileSize) {
  FILE *pFile;
  char *buffer;
  size_t result = 0;
  size_t d      = 0;
  struct stat pStat;
  
  pFile = fopen (fileIn, "r");
  stat(fileIn, &pStat);
  fileSize = pStat.st_size;
  
  buffer = new char [fileSize];
  while (result < fileSize) {
    d = fread(buffer + result, 1, fileSize - result, pFile);  
    if (d > 0) result += d;
    }
  fclose(pFile);
  
  return buffer;
}

void writeFile(char *buffer, size_t buffLen) {
  FILE *pFile;
  size_t result = 0;
  size_t d      = 0;

  pFile = fopen (fileOut, "w");
  while (result < buffLen) {
    d = fwrite(buffer + result, 1, buffLen - result, pFile);
    if (d > 0) result += d;
  }
  fclose(pFile);
}

int main() {
    size_t dataLen;
    char *data = readFile(dataLen);
    long n = atol(data);
    ofstream f(fileOut);
    
    long tmp;
    bool flag = 0;
    for(long i = 1; i <= n; i++) {
        tmp = i << 1;
        if (flag) {
            f << " " << tmp << " " << tmp - 1;
        } else {
            f << tmp << " " << tmp - 1;
            flag = 1;
        }
    }
    
    delete [] data;
    
    return 0;
}


Пробовал сначала всё печатать в массив char-ов, а потом уже в файл - не помогло :( Этот вариант самым быстрым пока оказался...


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
JUmPER
Дата 23.7.2007, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



Код

for(int i=2; i<=2*N; i+=2)
{
    f << i << ' ' << i-1 << ' ';
}

--------------------
Существует 10 типов людей: те, которые понимают двоичную систему, и те, которые ее не понимаютСуществует 10 типов людей: те, кто понимают троичную систему, те, кто ее не понимают и те, кто путает ее с двоичной
PM MAIL   Вверх
FelikZ
Дата 23.7.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый Маразматик
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 1.12.2006
Где: Vault 13

Репутация: нет
Всего: 5



Помоему лучше сначала в памяти все сделать, а потом все кинуть целиком в файл...


--------------------
user posted image
PM WWW ICQ Skype   Вверх
JUmPER
Дата 23.7.2007, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



Цитата(FelikZ @  23.7.2007,  14:53 Найти цитируемый пост)
Помоему лучше сначала в памяти все сделать, а потом все кинуть целиком в файл... 

обычно в таких задачах есть лимит и по памяти
--------------------
Существует 10 типов людей: те, которые понимают двоичную систему, и те, которые ее не понимаютСуществует 10 типов людей: те, кто понимают троичную систему, те, кто ее не понимают и те, кто путает ее с двоичной
PM MAIL   Вверх
FelikZ
Дата 23.7.2007, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый Маразматик
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 1.12.2006
Где: Vault 13

Репутация: нет
Всего: 5



Цитата(JUmPER @  23.7.2007,  14:57 Найти цитируемый пост)
обычно в таких задачах есть лимит и по памяти

ну значит, блоками туда пихать(скока память позволяет)... Ато так по паре символов оно дольше будет работать 100%

Это сообщение отредактировал(а) FelikZ - 23.7.2007, 15:13


--------------------
user posted image
PM WWW ICQ Skype   Вверх
JUmPER
Дата 23.7.2007, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



в stl'евских потоках уже есть буфер,
так что ничего больше прикручивать не надо.
--------------------
Существует 10 типов людей: те, которые понимают двоичную систему, и те, которые ее не понимаютСуществует 10 типов людей: те, кто понимают троичную систему, те, кто ее не понимают и те, кто путает ее с двоичной
PM MAIL   Вверх
W4FhLF
Дата 23.7.2007, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Цитата(FelikZ @  23.7.2007,  15:12 Найти цитируемый пост)
 Ато так по паре символов оно дольше будет работать 100%


Естественно. Или 100 записей в память и 1 в файл или 100 записей в файл и 100 в память. Грубо говоря smile 

3,14, однозначно сначала пиши в память, но организуй всё грамотно. Тебе под nix? 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
3,14
Дата 24.7.2007, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: нет
Всего: 24



Цитата(W4FhLF @  23.7.2007,  15:20 Найти цитируемый пост)
3,14, однозначно сначала пиши в память, но организуй всё грамотно. Тебе под nix?  

Не каких системных вызовов smile Требование чтоб компилилось g++.
Вообще глюк из за чего неуспевал - нашёл. Как ни странно, медленно работало чтение в массив символов с дальнейшим преобразованием в long.
Но от советов по ускорению кода всё равно не откажусь smile
Памяти достаточно чтоб писать сразу в память, а потом всё в файл, но быстрее таким образом у меня работать не стало. Если есть идеи как организовать код так, чтоб вариант с записью сначала в память, потом в файл работал быстрее - с удовольствием посмотрю код smile



--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
zkv
Дата 24.7.2007, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(W4FhLF @  23.7.2007,  15:20 Найти цитируемый пост)
Естественно. Или 100 записей в память и 1 в файл или 100 записей в файл и 100 в память. Грубо говоря


W4FhLF, так а что насчет:
Цитата(JUmPER @  23.7.2007,  15:17 Найти цитируемый пост)
в stl'евских потоках уже есть буфер,
так что ничего больше прикручивать не надо. 

я тоже так считал всегда, что уже все продумано, в этом плане, за меня.   smile 
PM MAIL   Вверх
3,14
Дата 24.7.2007, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: нет
Всего: 24



Цитата(zkv @  24.7.2007,  08:18 Найти цитируемый пост)
W4FhLF, так а что насчет:
Цитата(JUmPER @  23.7.2007,  15:17 Найти цитируемый пост)
в stl'евских потоках уже есть буфер,
так что ничего больше прикручивать не надо. 

я тоже так считал всегда, что уже все продумано, в этом плане, за меня.   smile  

Да, пока вариант с использованием ifstream/ofstream оказался самым быстрым.



--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0568 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.