Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ввод файла с помощью цикла в Builder'e, работа с файлами 
:(
    Опции темы
AFenix85
Дата 28.4.2007, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 20.4.2007
Где: Россия,Иркутск

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



Кто-нить помогите с кодом для ввода названия файла в цикле!Вот код

Код

void __fastcall TForm1::Button3Click(TObject *Sender)
{
  AnsiString FN;
  int fn,i;
  int j=StrToInt(Edit2->Text);
  char ch[80];
  fn=StrToInt(Edit1->Text);
  for(i=0;i<j;i++,fn++)
 {  if(fn==2365)
      {fn=3001;
      }
  FN=IntToStr(fn);
  FN="0"+FN+"V.dat";
  FILE*p=fopen("FN","r");
  FILE*o=fopen("one1.txt","w");
    if (p!=NULL);
      {

      fseek(p, 0L, SEEK_SET);
      while (!feof(p))
         {
       fgets(ch,80, p);
       strtok(ch, " ");
       fprintf(o,"%s\n",ch);
         }
         Memo1->Lines->Add(FN);

      }

  fclose(p);
  fclose(o);
 }
}


Мне очень надо,чтобы все работало автоматически!
Но прога выдает ошибку! 
PM MAIL   Вверх
SenkraD
Дата 28.4.2007, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 23



У меня щас нету времени чтобы посмотреть что к чему, но если тебе нужно загрузить данные с одного файла, потом дописать новые данные в конец и сохранить в новый файл, то вот самые простые грабли

Код

TStringList *pList;

pList = new TStringList();
pList->LoadFromFile("File1.txt");
// Тут в цикле используеш pList->Add("Новая строка");

pList->SaveToFile("File2.txt");


Вообщем пока это, а вечером дома посмотрю мож и черех старые функции решу


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
AFenix85
Дата 28.4.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 20.4.2007
Где: Россия,Иркутск

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



Это конечно хорошо,но мне надо в старом варианте!
А точнее,переделать этот код,чтобы работал?
Код

AnsiString FN;
  int fn,i;
  int j=StrToInt(Edit2->Text);
  char ch[80];
  fn=StrToInt(Edit1->Text);
  for(i=0;i<j;i++,fn++)
 {  if(fn==2365)
      {fn=3001;
      }
  FN=IntToStr(fn);
  FN="0"+FN+"V.dat";
  FILE*p=fopen("FN","r");

 

Имя файла в цикле изменяется на единицу,как все это сделать правильно,и чтобы  FILE*p=fopen("FN","r"); понимал имя файла? smile 
PM MAIL   Вверх
Anikmar
Дата 28.4.2007, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(AFenix85 @  28.4.2007,  10:48 Найти цитируемый пост)
  
FN="0"+FN+"V.dat";
FILE*p=fopen("FN","r");


Все замечательно, в переменной FN у вас нужное имя файла, но открываете вы всегда один и тот же файл с именем FN

Надо тогда открывать со сформированным именем:

FILE*p=fopen(FN.c_str(),"r");
PM MAIL ICQ   Вверх
SenkraD
Дата 28.4.2007, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 23



Вот держы долно работать или и это не подходит
Код

#include <fstream.h>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    String strFileName;
    int    nFileNumber;
    int    j = StrToInt(Edit2->Text);
    char   lpStr[80];

    nFileNumber = StrToInt(Edit1->Text);
    for(int i=0; i < j; i ++, nFileNumber ++)
    {
        if(nFileNumber == 2365)
        {
            nFileNumber = 3001;
        }

        strFileName = "0" + String(nFileNumber) + "V.dat";

        ifstream hInFile;
        ofstream hOutFile;

        hInFile.open(strFileName.c_str());
        hOutFile.open("one1.txt");
        if(!hInFile || !hOutFile)
        {
            ShowMessage("Не удалось открыть файл");
            return;
        }
        else
        {
            while(!hInFile.eof())
            {
                hInFile.getline(lpStr, sizeof(lpStr));
                hOutFile.write(lpStr, sizeof(lpStr));
            }
            Memo1->Lines->Add(strFileName);
        }

        hInFile.close();
        hOutFile.close();
    }
}


Это сообщение отредактировал(а) SenkraD - 28.4.2007, 11:05


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
AFenix85
Дата 29.4.2007, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 20.4.2007
Где: Россия,Иркутск

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



Цитата(Anikmar @  28.4.2007,  11:03 Найти цитируемый пост)
Все замечательно, в переменной FN у вас нужное имя файла, но открываете вы всегда один и тот же файл с именем FN

Надо тогда открывать со сформированным именем:

FILE*p=fopen(FN.c_str(),"r"); 


Че то я не вижу особой разници,так как все равно не работает smile 
PM MAIL   Вверх
Anikmar
Дата 29.4.2007, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(AFenix85 @  29.4.2007,  08:32 Найти цитируемый пост)
Че то я не вижу особой разници,так как все равно не работает   

Функция открытия файла должна работать, если такой файл существует. 
Посмотрите в отладчике имя получившегося файла и убедитесь в его наличии на диске в текущем каталоге.
Возможно нужно установить полный путь к файлам.
PM MAIL ICQ   Вверх
AFenix85
Дата 29.4.2007, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 20.4.2007
Где: Россия,Иркутск

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



Это понятно Anikmar,но если файла с номером 2363 нет,а файлы 2362 и 2364 есть,
чтоб прога сильно не ругалась,а просто проверила,и если файла нет,запустить следующий цикл? smile 
У меня в этом и проблема!

Это сообщение отредактировал(а) AFenix85 - 29.4.2007, 10:29
PM MAIL   Вверх
codelord
Дата 29.4.2007, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



думаю понятно что файлы называются 02V.dat 03.dat ... 010.dat и находятся в директории с программой
Код

  AnsiString FN;
  int fn,i;
  int j=StrToInt(Edit2->Text);
  char ch[80];
  fn=StrToInt(Edit1->Text);
  for(i=0;i<j;i++,fn++)
 {
  if( fn==2365 )    fn=3001;
  FN=IntToStr(fn);
  FN="0"+FN+"V.dat"; 
  FILE*p=fopen(FN.c_str(),"r");
  FILE*o=fopen("one1.txt","a");

  if( !p || !o ) {
                   fclose(p);
                   fclose(o);
                   continue;
                 }

  while ( fgets(ch,80, p) )
         {
          fprintf(o,"%s\n",ch);
         }
  Memo1->Lines->Add(FN);
  fclose(p);
  fclose(o);
 }



--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
AFenix85
Дата 29.4.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 20.4.2007
Где: Россия,Иркутск

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



codelord,а как у меня прочитать из ch например 20 произвольных символов? smile 
PM MAIL   Вверх
codelord
Дата 29.4.2007, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



Цитата(AFenix85 @  29.4.2007,  07:06 Найти цитируемый пост)
codelord,а как у меня прочитать из ch например 20 произвольных символов?

ну раз всеравно пользуешься Vcl, например так
Код

char str[] = "Это пример строки которая была, А это будет показано. Вот так!";
AnsiString substr(str);
ShowMessage(substr.SubString(33,20 ));

c кодом выше разобрался?
т.е хотел сказать подошел?

Это сообщение отредактировал(а) codelord - 29.4.2007, 11:40


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Anikmar
Дата 29.4.2007, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(AFenix85 @  29.4.2007,  10:28 Найти цитируемый пост)
Это понятно Anikmar,но если файла с номером 2363 нет,а файлы 2362 и 2364 есть,
чтоб прога сильно не ругалась,а просто проверила,и если файла нет,запустить следующий цикл?  
У меня в этом и проблема!

Так может сделать более универсально?
Вижу два подхода:
1. В лоб и не очень качественный. Перед открытием очередного файла проверяем его наличие на диске с помощью функции FileExists

2. Более изящный и как бы сделал я:
Я бы получил список имеющихся в директории файлов по маске и открывал бы их по списку.
PM MAIL ICQ   Вверх
codelord
Дата 29.4.2007, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



Цитата(Anikmar @  29.4.2007,  07:38 Найти цитируемый пост)
2. Более изящный и как бы сделал я:
Я бы получил список имеющихся в директории файлов по маске и открывал бы их по списку. 

или как сделал выше в измененном коде,  одно слово continue  smile 



--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Anikmar
Дата 29.4.2007, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(codelord @  29.4.2007,  11:41 Найти цитируемый пост)
или как сделал выше в измененном коде,  одно слово continue   

Подход, похожий, на мой первый вариант.
Только мой враиант будет работать несколько быстрее - так как только проверит наличие файла

Считаю такой подход в корне неправильным  smile 

Допустим, у нас есть только файлы с номерами 1 и 5000. Для того, чтобы обработать всего 2 файла, потребуется проход минимум 5000 циклов и 4998 холостых попыток открыть два файла! Точно не мой стиль! Причем второй-то файл успешно открывается и закрывается в холостую. Хоть бы открытие за проверку вынесли что ли.

Очень неудачный подход, на мой взгляд.
PM MAIL ICQ   Вверх
AFenix85
Дата 29.4.2007, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 20.4.2007
Где: Россия,Иркутск

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



Это конешно хорошо,что пишите smile 

Цитата(codelord @  29.4.2007,  11:22 Найти цитируемый пост)
c кодом выше разобрался?
т.е хотел сказать подошел?

Спасибо codelordда,я разобрался и все получилось smile 

А названия файлов я ввожу в Edite,так что ничего в холостую не пройдет,а если надо будет открыть два файла,открою отдельно!
Код

 while (!feof(p))
         {
       fgets(ch,80, p);
       strtok(ch, " ");
       fprintf(o,"%s\n",ch);
         }



Я имел ввиду здесь взять из ch произвольный симв массив,мне потом сортировать их надо будет smile 
PM MAIL   Вверх
codelord
Дата 29.4.2007, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



Цитата(Anikmar @  29.4.2007,  08:31 Найти цитируемый пост)

Допустим, у нас есть только файлы с номерами 1 и 5000. Для того, чтобы обработать всего 2 файла, потребуется проход минимум 5000 циклов и 4998 холостых попыток открыть два файла! Точно не мой стиль! Причем второй-то файл успешно открывается и закрывается в холостую. Хоть бы открытие за проверку вынесли что ли.

твой первый вариант и что ? нету файла что ты будешь делать ? наверно писать continue ?
Ко всему прочему напиши 5000 пусть будет в холостую посмотри сколько займет времени у процессора.
и третье
Цитата(Anikmar @  29.4.2007,  08:31 Найти цитируемый пост)
Хоть бы открытие за проверку вынесли что ли.

я код исправлял а не писал думаю это понятно.

Добавлено через 11 минут и 38 секунд
Цитата(AFenix85 @  29.4.2007,  09:05 Найти цитируемый пост)
Я имел ввиду здесь взять из ch произвольный симв массив,мне потом сортировать их надо будет

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


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Anikmar
Дата 29.4.2007, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(codelord @  29.4.2007,  13:36 Найти цитируемый пост)
твой первый вариант и что ? нету файла что ты будешь делать ? наверно писать continue ?

Ну зачем так бурно реагировать?  smile 
Свой первый вариант я тоже назвал в лоб и 
Цитата(Anikmar @  29.4.2007,  11:38 Найти цитируемый пост)
не очень качественный.

А почему мой маленько быстрее будет? Потому, что вызов функции FileExists - единственная проверка.
А вашем варианте она будет через функцию открытия файла. Т.е., вы вызываете функцию открытия файла, она проверяет его наличие, и в случае отсутствия возвращает ошибку.

Цитата(codelord @  29.4.2007,  13:36 Найти цитируемый пост)
я код исправлял а не писал думаю это понятно.

Ну дайте, я немного позанудствую. Уж исправлали бы и это  smile 

А вообще - странный подход все-таки, согласитесь. Перебирать все возможные имена файлов в цикле вместо того, чтобы взять их действительный список... Ну программирование оно на то и творчество - нравится так, значит делайте так. Работает то правильно - а это все-таки главное.

не понял, покажи пример строки и что надо взять и куда взять. 
Я понял так, что человек спрашивает каким образом взять подстроку из символьного массива.

AFenix85, Предлагаю воспользоваться функцией strncpy (посмотрите хелп по ней). Только не забудьте добавить 0 в конец результирующей строчки.

PM MAIL ICQ   Вверх
AFenix85
Дата 29.4.2007, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 20.4.2007
Где: Россия,Иркутск

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



Вобщем из строки ch мне надо выбрать строку,которая читается из Edita.То есть сравнить и найти колличество пробелов до этого сравнения!


Вот например кусок ch="   tm55   tm60   tm65   tm70   tm75   tm80   tm85   tm90   vx55".Он читается автоматически в проге из файла!
В Edite пусть будет написано tm85!Как сравнить эти два разных типа и провести учет пробелов! smile 

А потом мне надо будет произвести считывания и других строк с уже известного "пробела" числа для его обработки smile 


Код

char str[] = "Это пример строки которая была, А это будет показано. Вот так!";
AnsiString substr(str);
ShowMessage(substr.SubString(33,20 ));


 

Это немного не то,что мне надо было! 
PM MAIL   Вверх
Anikmar
Дата 29.4.2007, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



P.S.
codelord,  за плюсы спасибо  smile

Добавлено через 1 минуту и 58 секунд
AFenix85, вам чистый Си++ нужен? через AnsiString мне кажется удобнее малехо будет
PM MAIL ICQ   Вверх
AFenix85
Дата 29.4.2007, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 20.4.2007
Где: Россия,Иркутск

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



Цитата(Anikmar @  29.4.2007,  13:58 Найти цитируемый пост)
А вообще - странный подход все-таки, согласитесь. Перебирать все возможные имена файлов в цикле вместо того, чтобы взять их действительный список... Ну программирование оно на то и творчество - нравится так, значит делайте так. Работает то правильно - а это все-таки главное.


Я не виноват,мне дали файлы и сказали их посчитать по особому smile 
А мне куда деваться,вот и ищу пути побыстрее сделать прогу smile  

Цитата(Anikmar @  29.4.2007,  14:00 Найти цитируемый пост)
AFenix85, вам чистый Си++ нужен? через AnsiString мне кажется удобнее малехо будет 


Я не понимаю как это использовать,потому и не использую smile 
PM MAIL   Вверх
Anikmar
Дата 29.4.2007, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(AFenix85 @  29.4.2007,  14:13 Найти цитируемый пост)
Я не понимаю как это использовать,потому и не использую   

В общем то использовать базовые вещи языка можно, но более сложные вещи уже реализованы и в STL и в VCL - тут дело вкуса. Есть стандартные строковые типы данных, в которых реализован поиск в строке подстроки.

На примере чистого Си я уже не помнб есть ли функция поиска строки в подстроке
В VCL есть StrPos

Нам надо найти строку в подстроке, а затем с найденной позиции посчитать количество пробелов слева.
PM MAIL ICQ   Вверх
codelord
Дата 29.4.2007, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



приблизительно так (там где идет считывание из файла) 
допустим то что ищем лежит в Edit3
Код

  while ( fgets(ch,80, p) )
         {
          //-----------------------
           AnsiString sub(ch);
           int k, separator = 0;
           k =  sub.Pos(Edit3->Text);
           for( int j = 0; j < k; j++ ) {
               if( ch[j]  == ' ' ) separator++;
             }
             // в separator лежит количество пробелов в считываемой строке
          //--------------------------
          fprintf(o,"%s\n",ch);
         }



--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
codelord
Дата 29.4.2007, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



Цитата(Anikmar @  29.4.2007,  13:15 Найти цитируемый пост)
На примере чистого Си я уже не помнб есть ли функция поиска строки в подстроке

char *strstr(const char *s1, const char *s2);  


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
AFenix85
Дата 1.5.2007, 03:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 20.4.2007
Где: Россия,Иркутск

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



Цитата(codelord @  29.4.2007,  18:05 Найти цитируемый пост)
char *strstr(const char *s1, const char *s2);   


Дык в этом то и проблема,как из string из Edita, переделать в char smile  smile  smile  
PM MAIL   Вверх
Klin
Дата 1.5.2007, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Если речь об AnsiString, то для этого функция есть: 
Код

 Edit1->Text.c_str();   



--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Voldemar2004
Дата 1.5.2007, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

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



А может быть лучше так читать файл
Код
//---------------------------------------------------------------------------

#include <sstream>

#include <fstream>

std::string ReadFile(char* FileName)
{

std::stringstream buffer;

            std::string str;

            std::ifstream file(FileName);

            while( !file.eof() )
            {
                getline(file, str);       
                buffer << str << '\n';
            }

return buffer.str();

}

//---------------------------------------------------------------------------
, чем через объекты Builder'a ? Просто подключить функцию и не зависеть от свойств объектов. smile 


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
AFenix85
Дата 2.5.2007, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 20.4.2007
Где: Россия,Иркутск

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



Voldemar2004, я это знаю, но мне надо именно в форме smile  
PM MAIL   Вверх
AFenix85
Дата 2.5.2007, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 20.4.2007
Где: Россия,Иркутск

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



Помгите с одной проблемкой!Вот код:
Код

void __fastcall TForm1::Button3Click(TObject *Sender)
{
  int fn,i,j,n;
  char ch[400],*s,*st;
  AnsiString FN;
  fn=StrToInt(Edit1->Text);
  j=StrToInt(Edit2->Text);
  s=Edit3->Text.c_str();
  for(i=0;i<j;i++,fn++)
  {if(fn==2365 || fn==2366)
      {fn=3001;
      }
  FN=IntToStr(fn);
  FN="ìåñÿö\\0"+FN+"V.dat";
  FILE*p=fopen(FN.c_str(),"r");
  FILE*o=fopen("one1.txt","w");
    if(!p)
      {fclose(p);
       fclose(o);
       continue;
      }
       fseek(p, 0, SEEK_SET);
       while (!feof(p))
         {
          fgets(ch,strlen(ch) + 1, p); //ïðî÷èòàëè ñòðîêó èç ôàéëà
          if(strcmp(ch,s)==0)
            {break;
            }

          fputs(ch,o);                  //çàïèñàëè åå â ôàéë



         }
  Memo1->Lines->Add(FN);
  fclose(p);
  fclose(o);

}
}


Как здесь сделать так,чтобы в ch найти s и найти длину строки ch до этого совпадения? smile 
Никак не могу с этим справиться сам!Подскажите smile  или исправте smile 
PM MAIL   Вверх
Anikmar
Дата 2.5.2007, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Что-то в этом роде:
Код

char *p;
int LenLeft;

p = strstr(ch, s);
if (p==NULL) ... Строка не найдена
LenLeft = ch - p;

PM MAIL ICQ   Вверх
Weaver
Дата 4.5.2007, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ребята, извините, вот вы тут занимаетесь извратом, насколько я понял.

Задача простая, но решение у вас очень замороченное.

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

PM MAIL WWW   Вверх
AFenix85
Дата 5.5.2007, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 20.4.2007
Где: Россия,Иркутск

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



Цитата(Weaver @  4.5.2007,  15:44 Найти цитируемый пост)
Ребята, извините, вот вы тут занимаетесь извратом, насколько я понял.


Ишь какой умный,а как это реализовать,если компилер постоянно ругается или прога работает но ничего невыдает smile 

Лучше бы написал че дельное!
PM MAIL   Вверх
AFenix85
Дата 5.5.2007, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 20.4.2007
Где: Россия,Иркутск

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



Ребята,я впал в ступор,башка не варит! smile 

Напишите примеры как из Edit1->Text перейти к char smile 

 
PM MAIL   Вверх
Anikmar
Дата 5.5.2007, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(AFenix85 @  5.5.2007,  15:33 Найти цитируемый пост)
Напишите примеры как из Edit1->Text перейти к char

Уже отвечали.

Edit1->Text.c_str(); - вернет указатель на char*. (Константный)

Код

char Buf[200];
strcpy(Buf,Edit1->Text.c_str());


Естественно без контроля длины
PM MAIL ICQ   Вверх
AFenix85
Дата 5.5.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 20.4.2007
Где: Россия,Иркутск

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



Цитата(Anikmar @  5.5.2007,  15:50 Найти цитируемый пост)
Уже отвечали.


Так как компилер именно здесь ругается,снова и спрашиваю smile 


PM MAIL   Вверх
Klin
Дата 5.5.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(AFenix85 @  5.5.2007,  17:15 Найти цитируемый пост)
Так как компилер именно здесь ругается,снова и спрашиваю 

Матом? Или текст ошибки есть? smile


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
AFenix85
Дата 5.5.2007, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 20.4.2007
Где: Россия,Иркутск

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



Цитата(Klin @  5.5.2007,  16:23 Найти цитируемый пост)
Матом? Или текст ошибки есть?  


Говорит типа нельзя перейти "AnsiString" to "Char"

А если Char *s;strcpy(s,Edit1->Text.c_str());

То конечно работает,но уже strcmp(&s,"******"); ругается! smile   
PM MAIL   Вверх
Klin
Дата 5.5.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(AFenix85 @  5.5.2007,  17:41 Найти цитируемый пост)
А если Char *s;strcpy(s,Edit1->Text.c_str());

Так так и надо! Там оба параметра char*

Добавлено через 1 минуту и 8 секунд
Цитата(AFenix85 @  5.5.2007,  17:41 Найти цитируемый пост)
strcmp(&s,"******"); 

Зачем &s? просто s (оно же char*).


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Anikmar
Дата 5.5.2007, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Память под строку не забудьте выделить.
Не просто 
char *s;

А что-то вроде
char s[100];

или что-то в этом духе.

PM MAIL ICQ   Вверх
AFenix85
Дата 6.5.2007, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 20.4.2007
Где: Россия,Иркутск

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



не klin все равно выдает ошибку и ставит стрелку там где у меня в коде звездочки! smile 
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                 Application->Initialize();
                 Application->CreateForm(__classid(TForm1), &Form1);
                 Application->Run();
        }   ******
        catch (Exception &exception)


Вот весь мой код,может кто посмотрит и найдет ошибку smile 
Код

//---------------------------------------------------------------------------
#include<iostream.h>
#include<fstream.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#include<vcl.h>

#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button3Click(TObject *Sender)
{
double TM[1000];
int fn,i,j,c,k,n;
char ch[400],ss[56][7],*s;
AnsiString FN,FNO;
fn=StrToInt(Edit1->Text);
j=StrToInt(Edit2->Text);
s=Edit3->Text.c_str();
if(strcmp(s,"tm55")==0)n=1;
if(strcmp(s,"tm60")==0)n=2;
if(strcmp(s,"tm65")==0)n=3;
if(strcmp(s,"tm70")==0)n=4;
if(strcmp(s,"tm75")==0)n=5;
if(strcmp(s,"tm80")==0)n=6;
if(strcmp(s,"tm85")==0)n=7;
if(strcmp(s,"tm90")==0)n=8;
if(strcmp(s,"vx55")==0)n=9;
if(strcmp(s,"vx60")==0)n=10;
if(strcmp(s,"vx65")==0)n=11;
if(strcmp(s,"vx70")==0)n=12;
if(strcmp(s,"vx75")==0)n=13;
if(strcmp(s,"vx80")==0)n=14;
if(strcmp(s,"vx85")==0)n=15;
if(strcmp(s,"vx90")==0)n=16;
if(strcmp(s,"vy55")==0)n=17;
if(strcmp(s,"vy60")==0)n=18;
if(strcmp(s,"vy65")==0)n=19;
if(strcmp(s,"vy70")==0)n=20;
if(strcmp(s,"vy75")==0)n=21;
if(strcmp(s,"vy80")==0)n=22;
if(strcmp(s,"vy85")==0)n=23;
if(strcmp(s,"vy90")==0)n=24;
if(strcmp(s,"vz55")==0)n=25;
if(strcmp(s,"vz60")==0)n=26;
if(strcmp(s,"vz65")==0)n=27;
if(strcmp(s,"vz70")==0)n=28;
if(strcmp(s,"vz75")==0)n=29;
if(strcmp(s,"vz80")==0)n=30;
if(strcmp(s,"vz85")==0)n=31;
if(strcmp(s,"vz90")==0)n=32;
if(strcmp(s,"vh55")==0)n=33;
if(strcmp(s,"vh60")==0)n=34;
if(strcmp(s,"vh65")==0)n=35;
if(strcmp(s,"vh70")==0)n=36;
if(strcmp(s,"vh75")==0)n=37;
if(strcmp(s,"vh80")==0)n=38;
if(strcmp(s,"vh85")==0)n=39;
if(strcmp(s,"vh90")==0)n=40;
if(strcmp(s,"az55")==0)n=41;
if(strcmp(s,"az60")==0)n=42;
if(strcmp(s,"az65")==0)n=43;
if(strcmp(s,"az70")==0)n=44;
if(strcmp(s,"az75")==0)n=45;
if(strcmp(s,"az80")==0)n=46;
if(strcmp(s,"az85")==0)n=47;
if(strcmp(s,"az90")==0)n=48;
if(strcmp(s,"ht55")==0)n=49;
if(strcmp(s,"ht60")==0)n=50;
if(strcmp(s,"ht65")==0)n=51;
if(strcmp(s,"ht70")==0)n=52;
if(strcmp(s,"ht75")==0)n=53;
if(strcmp(s,"ht80")==0)n=54;
if(strcmp(s,"ht85")==0)n=55;
if(strcmp(s,"ht90")==0)n=56;

  for(i=0;i<j;i++,fn++)
  {if(fn==2365 || fn==2366)
      {fn=3001;
      }
  FN=IntToStr(fn);
  FN="ìåñÿö\\0"+FN+"V.DAT";
  FNO="ãèñòîãðàììû\\0"+FN+"VG.DAT";
  FILE*p=fopen(FN.c_str(),"r");
      if(!p)
      {fclose(p);
       continue;
      }
  FILE*o=fopen(FNO.c_str(),"w");

  fgets(&ch[0],500,p);

  k=0;
    while(!feof(p))
     {    for(c=0;c<56;c++)fscanf(p,"%s",&ss[c][0]);
    if(strcmp(&ss[n][0],"******")==0)TM[k]=1000;
    else TM[k]=atof(&ss[n][0]);
        ListBox1->Items->Add(TM[k]);
        //fprintf(o,"%7.3lf\n",TM[k]);
    k++;

     }



  fclose(p);
  fclose(o);

}
}

//---------------------------------------------------------------------------


PM MAIL   Вверх
Anikmar
Дата 6.5.2007, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(AFenix85 @  6.5.2007,  14:47 Найти цитируемый пост)
не klin все равно выдает ошибку и ставит стрелку там где у меня в коде звездочки!

Текст ошибки можно?
PM MAIL ICQ   Вверх
Klin
Дата 6.5.2007, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Anikmar @  6.5.2007,  23:13 Найти цитируемый пост)
Текст ошибки можно? 

Не информация секретная smile

А если серьезно, то текст ошибки действительно не помешал бы, а то разгребать весь код (там все-таки файлы используются) - это время. Которого так не хватает нам в жизни smile


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
AFenix85
Дата 7.5.2007, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 20.4.2007
Где: Россия,Иркутск

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



Debugger Exception Notification

Project Project1.exe raised exception class EAccessViolation with message 'Access violetion at address 0045D7C5 in module
'Project1.exe'.Read of address 0096AE45'.Process stopped.Use Step or Run to continue.

ну че,легче вам от этого? smile  
PM MAIL   Вверх
Anikmar
Дата 7.5.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(AFenix85 @  7.5.2007,  12:11 Найти цитируемый пост)
ну че,легче вам от этого?    

На самом деле лично мне да. Потому, что в приведенных вами кодах есть 2 места со звездочками. Мне было интересно как именно ругается комп.

Уверен на 99%, что ошибка здесь:
Код

for(c=0;c<56;c++)fscanf(p,"%s",&ss[c][0]);


Вы на 100% уверены, что fscanf не цепанет строку длиннее 6 символов?
Так как ваш массив предназначен только для 7 символов в каждой строчке (включая 0), то вариант порчи памяти весьма вероятен. Проверьте под отладчиком что там реально считывается.

P.S.
Я бы не стал из файла считывать в такой ограниченный буфер без какого-либо контроля длины. Если файл битый - программа слетит за милую душу - нигде нет защиты от этого.



PM MAIL ICQ   Вверх
AFenix85
Дата 7.5.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 20.4.2007
Где: Россия,Иркутск

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



Anikmar дело в том,что моя таблица уже составлена так,что там длина ВСЕХ чисел и заголовков 3,4,5,6 символа и пробел (\0 является вторым пробелом но его не учитываем)!

А не могли бы вы более конкретно обьяснить почему именно этот цикл!?

Вся моя прога работает,но если я отключу ввод из Edita, хотелось из него!Ну да ладно,главное работает исправно без этого,хоть и очень обьемный текст проги получается!      
PM MAIL   Вверх
Klin
Дата 7.5.2007, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



AFenix85, Согласен с Anikmar, насчет контроля длины.
Цитата(AFenix85 @  7.5.2007,  16:24 Найти цитируемый пост)
А не могли бы вы более конкретно обьяснить почему именно этот цикл!?

Дело  не в цикле, а в функции fscanf!


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Anikmar
Дата 7.5.2007, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Если вы беспокоитесь за конструкцию с Edit то смотрите сами:

Вы делаете так:
Код

s=Edit3->Text.c_str();
if(strcmp(s,"tm55")==0)n=1;


Но коль уж пользоваться AnsiString и скорость не так критична, то можно вообще отказаться от такого подхода. Пишите просто так:

Код

if (Edit3->Text == "tm55") n = 1;


PM MAIL ICQ   Вверх
AFenix85
Дата 8.5.2007, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 20.4.2007
Где: Россия,Иркутск

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



Цитата(Klin @  7.5.2007,  18:28 Найти цитируемый пост)
Дело  не в цикле, а в функции fscanf!

А по подробнее можно,в чем именно дело у этой функции!
PM MAIL   Вверх
Anikmar
Дата 8.5.2007, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(AFenix85 @  8.5.2007,  15:48 Найти цитируемый пост)
А по подробнее можно,в чем именно дело у этой функции! 

Пройдитесь отладчиком и посмотрите, что эта функция реально выдирает из файла.
Мне кажется она может портить память.
Замените
fscanf(p,"%s",&ss[c][0]);
на
char *sTemp[200];

fscanf(p,"%s",sTemp);

И посмотрите - что  реально за каждый проход циклас считывается. Нет ли там строки длиннее 6

PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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