Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ввод файла с помощью цикла в 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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