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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2008, 21:02   #1
DaRKSPiRT
Пользователь
 
Регистрация: 28.05.2008
Сообщений: 12
По умолчанию

товарищи, задача такова: есть текстовый файл *.txt с рядом чисел формата *.*** ; необходимо считать из этого файла числа в буфер. можно vector<int> chisla; и посчитать автокореляционную функцию. цикл самой функции я написал. программа есть но на выходе выдает белеберду а не числа.
помогите советом может надо представлять данные из файла в каком то другом виде? C++ Builder 6.0
Код:
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
   FILE *Sig_in,*Res;
   short int x;
   vector<short int> buffer;
   vector<short int> result;
   if((Sig_in=fopen(Input_File->Text.c_str(),"rb")) == NULL)
   {
      ShowMessage("Ошибка открытия файла "+ Input_File->Text);
      Input_File->Text="";
   }
   else
   {
      while(fread(&x,2,1,Sig_in)!=NULL) buffer.push_back(x);
      fclose(Sig_in);
      int num_of_element=buffer.size();
      for(int i=0; i<num_of_element; i++) buffer.push_back(buffer[i]);
      for (int i=0; i<num_of_element; i++)
      {
         short int sum=0;
         for(int j=0; j<i; j++) sum+=buffer[num_of_element-j+i]*buffer[j];
         result.push_back(sum);
      }
      if((Res=fopen(Output_File->Text.c_str(),"wb"))==NULL)
      {
         ShowMessage("Ошибка создания файла "+ Output_File->Text);
         Output_File->Text="";
      }
      else
      {
         for(int i=0; i<num_of_element; i++) fwrite(&result[i], 2, 1, Res);
         fclose(Res);

      }
   }
   Label3->Caption="Расчет окончен";
       Label3->Visible=True;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   OpenDialog1->Execute();
}
void __fastcall TForm1::OpenDialog1SelectionChange(TObject *Sender)
{
   Input_File->Text=OpenDialog1->FileName;
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
   SaveDialog1->Execute();
}
void __fastcall TForm1::SaveDialog1CanClose(TObject *Sender,
      bool &CanClose)
{
   Output_File->Text=SaveDialog1->FileName;
}
DaRKSPiRT вне форума Ответить с цитированием
Старый 28.05.2008, 21:22   #2
merax
Форумчанин
 
Регистрация: 27.12.2006
Сообщений: 955
По умолчанию

Один вопрос - одна тема !!!
merax вне форума Ответить с цитированием
Старый 02.06.2008, 15:34   #3
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от DaRKSPiRT Посмотреть сообщение
......но на выходе выдает белеберду а не числа.
В чём заключается "белиберда"? Как должны выглядеть "числа" в файле?
B_N вне форума Ответить с цитированием
Старый 02.06.2008, 20:56   #4
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Расширение txt наталкивает на мысль о том, что это обычный текстовый файл, с которым вы пытаетесь работать бинарно (“rb”/”wb” и fread/fwrite). Вероятно, что ошибка у вас начинается здесь.

Для более точного ответа хорошо бы привести пример входных и выходных данных, а также то, что ожидается увидеть в buffer после считывания входных данных. И еще не очень понятен что за формат чисел (не десятичная ли дробь?) во входном файле, а также как они там записаны (бинарно или текстово).
filosof_x86 вне форума Ответить с цитированием
Старый 04.06.2008, 22:51   #5
DaRKSPiRT
Пользователь
 
Регистрация: 28.05.2008
Сообщений: 12
По умолчанию

пример входного файла:
23
25
53
64
24
и т.д. (можно в строчку через пробел)
пример выходного аналогичен.
DaRKSPiRT вне форума Ответить с цитированием
Старый 05.06.2008, 01:38   #6
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Как и предполагал, файл у вас текстовый, а работаете вы с ним как с бинарным. К тому же, если стали использовать stl, то так и используйте ее и для работы с файлами. Вот пример кода:

Код:
#include <iostream>
#include <fstream>
#include <vector>

int main()
{
  std::vector<int> buffer;
  std::ifstream in("in.txt");
  
  if(in) {
    typedef std::istream_iterator<int> ii;
    std::copy(ii(in), ii(), std::back_inserter(buffer)); // загружаем все целые числа в вектор
    in.close();
    
    typedef std::vector<int>::iterator it;
    // выводим и затем увеличиваем значение каждого элемента на единицу
    for(it p = buffer.begin(); p != buffer.end(); p++) std::cout << (*p)++ << std::endl; 

    // теперь сохраним результаты в другой файл
    std::ofstream out("out.txt");
    if(out) {
      std::copy(buffer.begin(), buffer.end(), std::ostream_iterator<int>(out, "\n")); // "\n" - то, что добавляется после вывода 1 элемента
      out.close();
    } else std::cout << "error: out.txt" << std::endl;

  } else std::cout << "error: in.txt" << std::endl;
  
  return 0;
}
in.txt
Код:
1
2 3
55     66		77
out.txt
Код:
2
3
4
56
67
78
filosof_x86 вне форума Ответить с цитированием
Старый 09.06.2008, 00:50   #7
DaRKSPiRT
Пользователь
 
Регистрация: 28.05.2008
Сообщений: 12
По умолчанию

такие ошибки:

Build
[C++ Error] Unit1.cpp(41): E2316 'istream_iterator' is not a member of 'std'
[C++ Error] Unit1.cpp(41): E2040 Declaration terminated incorrectly
[C++ Error] Unit1.cpp(42): E2268 Call to undefined function 'ii'
[C++ Error] Unit1.cpp(52): E2316 'ostream_iterator' is not a member of 'std'
[C++ Error] Unit1.cpp(52): E2188 Expression syntax
DaRKSPiRT вне форума Ответить с цитированием
Старый 09.06.2008, 02:24   #8
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Я видимо неудачно сюда перенес код, не хватает строчки
Код:
#include <iterator>
filosof_x86 вне форума Ответить с цитированием
Старый 09.06.2008, 15:31   #9
DaRKSPiRT
Пользователь
 
Регистрация: 28.05.2008
Сообщений: 12
По умолчанию

Все замечательно сработало. Остался маленький нюанс относящийся к вычисмлению самой АКФ.

Код:
for(int j=0; j<num_of_element; j++) sum+=buffer[j+i]*buffer[j];\вычисление функции с задержкой i.
result.push_back(sum); \записывает в буфер
вот как это выглядело в предыдущем примере. как бы по грамотнее это реализовать в новом коде?
DaRKSPiRT вне форума Ответить с цитированием
Старый 10.06.2008, 21:16   #10
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Строчку
Код:
for(int i=0; i<num_of_element; i++) buffer.push_back(buffer[i]);
лучше заменить на
Код:
buffer.insert(buffer.end(),buffer.begin(),buffer.end());
Блок
Код:
for (int i=0; i<num_of_element; i++)  
{  
    short int sum=0;  
    for(int j=0; j<i; j++) sum+=buffer[num_of_element-j+i]*buffer[j];  
    result.push_back(sum);  
}
Можно переделать с использованием итераторов. Пример работы с итераторами есть в моем куске кода выше.
filosof_x86 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция ZiLi Microsoft Office Excel 1 05.09.2008 18:37
функция sergei64_89 Общие вопросы C/C++ 2 25.05.2008 16:48
функция Janette Помощь студентам 1 29.04.2008 20:10
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50