Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2012, 08:13   #1
three_cats
Форумчанин
 
Аватар для three_cats
 
Регистрация: 27.09.2012
Сообщений: 175
Вопрос Оптимизация кода задачи

Помогите оптимизировать код готовой задачи. Уверен, она должна решаться намного проще. Думаю, комментировать код не нужно, там все должно быть предельно ясно.

Код:
/* 31.1 Даны файлы f и g, компоненты которых целые числа. В файл s записать сумму компонентов файлов (поэлементно), 
 *  а в файл r их разность.
 */
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <locale>

using namespace std;

void main() {

setlocale(LC_ALL,"Russian");

string name = "c:/buisness/cpp/file1.txt";
ifstream ifs1(name.c_str());
if (!ifs1) cerr << "Невозможно обратиться к файлу!" << endl;
string s = "";
ifs1.seekg(0);
while (!ifs1.eof())
s += ifs1.get();
ifs1.close();

vector<int> v1;
string tmp = "";

for (int i=0;i<s.size()-1;i++) {
while (s[i]!=' ') {
tmp += s[i];
i++;
}
int tmpint = atoi(tmp.c_str());
v1.push_back(tmpint);
tmp = "";
tmpint = 0;
}

name = "c:/buisness/cpp/file2.txt";
ifstream ifs2(name.c_str());
if (!ifs2) cerr << "Невозможно обратиться к файлу!" << endl;
s = "";
ifs2.seekg(0);
while (!ifs2.eof())
s += ifs2.get();
ifs2.close();

vector<int> v2;
tmp = "";

for (int i=0;i<s.size()-1;i++) {
while (s[i]!=' ') {
tmp += s[i];
i++;
}
int tmpint = atoi(tmp.c_str());
v2.push_back(tmpint);
tmp = "";
tmpint = 0;
}

name = "c:/buisness/cpp/file3.txt";
ofstream ofs1(name.c_str());
for (int i=0;i<v1.size();i++)
ofs1 << v1[i]+v2[i] << " ";

name = "c:/buisness/cpp/file4.txt";
ofstream ofs2(name.c_str());
for (int i=0;i<v1.size();i++)
ofs2 << v1[i]-v2[i] << " ";
return;
}
Никто

мой блог
three_cats вне форума Ответить с цитированием
Старый 28.09.2012, 09:22   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Можно убрать все массивы - прочитали строку из одного файла, прочитали из второго, просуммировали, записали в третий файл...
waleri вне форума Ответить с цитированием
Старый 28.09.2012, 09:24   #3
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Код:
while (!ifs2.eof())
s += ifs2.get();
ifs2.close();
Я не понял - Вы по одному символу выбираете что-ли?
Цитата:
istream& get (char* s, streamsize n );
Extracts characters from the stream and stores them as a c-string into the array beginning at s. Characters are extracted until either (n - 1) characters have been extracted or the delimiting character '\n' is found. The extraction also stops if the end of file is reached in the input sequence or if an error occurs during the input operation.
If the delimiting character is found, it is not extracted from the input sequence and remains as the next character to be extracted. Use getline if you want this character to be extracted (and discarded).
The ending null character that signals the end of a c-string is automatically appended at the end of the content stored in s.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 28.09.2012, 11:38   #4
three_cats
Форумчанин
 
Аватар для three_cats
 
Регистрация: 27.09.2012
Сообщений: 175
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Можно убрать все массивы - прочитали строку из одного файла, прочитали из второго, просуммировали, записали в третий файл...
Каким образом это сделать, если необходимо значения, разделенные пробелами, из строки, преобразовать в числовой формат, чтобы просуммировать?

Цитата:
Сообщение от Utkin
Я не понял - Вы по одному символу выбираете что-ли?
А как нужно?
Никто

мой блог
three_cats вне форума Ответить с цитированием
Старый 28.09.2012, 13:38   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
А как нужно?
Файл целиком, построчно или по буферно - фиксированным размером. По одному символу всегда медленно. В файловой системе на диске файлы хранятся не побайтно, а сразу блоками. Для NTFS обычно 4 кб. То есть, если Вам нужно прочесть один байт будет прочитан весь блок. То есть если Ваш файл занимает 100 байт, Вы 100 раз читаете информацию размером в 4 Кб и только затем функция возвращает оттуда один байт. Конечно есть кеширование, однако оно все равно не так быстро, если читать информацию побайтно. Читайте данные в буфер, кратный 4 кб, так Вы получите оптимальную скорость для файлов любого размера.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 28.09.2012 в 13:53.
Utkin вне форума Ответить с цитированием
Старый 28.09.2012, 14:12   #6
three_cats
Форумчанин
 
Аватар для three_cats
 
Регистрация: 27.09.2012
Сообщений: 175
По умолчанию

Utkin, спасибо, весьма познавательно! А как тогда на C++ прочитать файл целиком(в буфер/побайтно)?
Никто

мой блог
three_cats вне форума Ответить с цитированием
Старый 28.09.2012, 14:20   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

В посте #3 как бы указано. И второе - это справочные данные, и они есть в гугле.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 28.09.2012, 15:13   #8
three_cats
Форумчанин
 
Аватар для three_cats
 
Регистрация: 27.09.2012
Сообщений: 175
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
В посте #3 как бы указано. И второе - это справочные данные, и они есть в гугле.
Да, точно! Спасибо!
Никто

мой блог
three_cats вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация (сокращение) кода решения задачи #2 c acmp.ru - нахождение суммы целых чисел от 1 до N Serge_Bliznykov Помощь студентам 31 23.08.2014 22:35
Оптимизация кода Shouldercannon Общие вопросы Delphi 23 22.07.2010 22:45
Оптимизация кода viscas PHP 3 31.05.2009 16:04
Оптимизация кода nusik Общие вопросы Delphi 2 21.05.2009 17:55
Оптимизация кода [Smarik] Gamedev - cоздание игр: Unity, OpenGL, DirectX 9 20.08.2008 15:00