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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Открытие файла на чтение функция fopen, что бы код был красивым 
:(
    Опции темы
bigturtle
Дата 27.1.2009, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте, задача нужно создать файл и записать в него поочередно кусок из одного файла(ну допустим слово) кусок из другого файла, потом опять кусок из первого файла кусок из второго и сново тоже самое. Получается, что это часть подпрограммы то есть организуется с помошью отдельных функций. Одна функция отвечает за открытие одного файла, другая за открытие другого. Вопрос как нужно реализовать, что бы при первом вызове функции, программа понимала, что файл нужно открыть, а при втором продолжала чтение из это го же файла. После чего если файл прочтется до конца, но функция закончится, то при повторном открытии, функция поняла, что файл хоть и открыт, но закончен по этому нужно повторно открыть. 
Вот примерный кусок коды.

 
Код

void ad(void){    
    FILE *a_txt;
// Вот тут надо, что то вставить что бы процес не повторялся каждый раз....
        if ((a_txt=fopen("1.txt","r"))== NULL) {
           printf("Error File 1.txt\n");
           system("pause");
           exit(1);
             }
    
while(1){
            dir1=fgetc(a_txt);
     
            if (!feof(a_txt)){
            if(dir1==';'){break;}                
        
        fputc(dir1,g);// записываем в файл g он оглашен ранее
            }
            else { fclose(a_txt);    
                if ((a_txt=fopen("1.txt","r"))== NULL) {
                                    printf("Error File 1.txt\n");
                                    system("pause");
                                    exit(1);
                                      }}


Получается, что при вызове функция  будет считывать одно и тоже слово. а нужно, что бы продолжало читать дальше. Спасибо.

Это сообщение отредактировал(а) bigturtle - 27.1.2009, 21:47
PM MAIL   Вверх
destrd
Дата 27.1.2009, 21:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



передавайте ей открытый файл как параметр, как вариант.
--------------------
Some people, when confronted with a problem, think, "I known, I'll use regular expressions." Now they have two problems.        -- Jamie Zawinski in comp.lang.emacs
PM MAIL ICQ   Вверх
bigturtle
Дата 27.1.2009, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В смысле? есть еще такойвриант
Код

void ad(void){    
    FILE *a_txt;
/*например вот*/  if (a_txt!=fopen("1.txt","r")){// но при большом количеств вылетает.
        if ((a_txt=fopen("1.txt","r"))== NULL) {
           printf("Error File 1.txt\n");
           system("pause");
           exit(1);
             }}
    
while(1){
            dir1=fgetc(a_txt);
     
            if (!feof(a_txt)){
            if(dir1==';'){break;}                
        
        fputc(dir1,g);// записываем в файл g он оглашен ранее
            }
            else { fclose(a_txt);    
                if ((a_txt=fopen("1.txt","r"))== NULL) {
                                    printf("Error File 1.txt\n");
                                    system("pause");
                                    exit(1);
                                      }}

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


Эксперт
****


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

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



Так нельзя. после объявления FILE *a_txt; содержит неопределённое значение, пиши FILE *a_txt = NULL;
Код

FILE* my_open_text_file_for_read(const char* filename) {
FILE* f = fopen(filename, "r");
if (f == NULL) {
printf("Error opening file %s\n", filename);
exit(1);
}
return f;
}

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


Шустрый
*


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

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



Не знаю компилятор обрабатывает, и все работает только при больших  количества переписывания файла вылетает Error File 1.txt\n.
В вашем варианте тоже при вызове функции файл будет заново открываться, а мне нужно, что бы он читался если уже открыт. 
PM MAIL   Вверх
math64
Дата 28.1.2009, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

Это сообщение отредактировал(а) math64 - 28.1.2009, 12:09
PM   Вверх
math64
Дата 28.1.2009, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

class MyFileReader {
const char* filename;
FILE* file;
MyFileReader(const char* fname) {
   filename = strdup(fname);
   file = fopen(filename, "r");
}
~MyFileReader() {
if (file != NULL)
  fclose(file);
free(filename);
}
int read() {
  if (file == NULL || feof(file))
    file = fopen(filename, "r");
  if (file == NULL)
    return -1;
  return fgetc(file);
}
}

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


Опытный
**


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

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



Код

 
#include <stdio.h>

/* повторяет копирование файла несколько раз */
main()
{
    FILE *func(FILE *ofp);
    FILE *ofp;
    int i;
    
    if ((ofp = fopen("file2.txt", "wb")) == NULL)
        return 1;
    for (i = 0; i < 5 && func(ofp) != NULL; i++)
        ;
    return 0;
}

FILE *func(FILE *f)
{
    static FILE *ifp = NULL;
    int c;
    
    if (ifp != NULL && feof(ifp))
        rewind(ifp);
    else if (ifp == NULL
          && (ifp = fopen("file.txt", "rb")) == NULL)
        return NULL;
    while ((c = fgetc(ifp)) != EOF && c != ';')
        fputc(c, f);    
    if (c == ';')
        rewind(ifp);
    return f;
}

PM MAIL   Вверх
bigturtle
Дата 29.1.2009, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот остановился на врианте
Код


#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
using namespace std;
void open1(void);
void open2(void); 
char dir1;    FILE *gtext;
int main() {
    int slshislo,kol=10000,sh_kol=0,i=0;
    printf("-----------------------------------------\n");
    puts("open");
    printf("-----------------------------------------\n");
    
    if ((gtext=fopen("3.txt","w"))== NULL) {
                                        printf("Error File 1.txt\n");
                                        system("pause");
                                        exit(1);
                                          }
    
    
    
    for (sh_kol=0;sh_kol<kol;sh_kol++){


 open1();open2();
     open1();
     open1();open2();open2();open2();open2();
    
        
        
}    

    system("pause");
    
    
    
    return 0;
}
void open1(void){    
static FILE *open1_txt;

if(open1_txt==NULL){ if ((open1_txt=fopen("1.txt","r"))== NULL) {
                                        printf("Error File 1.txt\n");
                                        system("pause");
                                        exit(1);
                                          }}
    
    
while(1){
    
    dir1=fgetc(open1_txt);printf("aaa");
     
            if (!feof(open1_txt)){
            if(dir1==';'){break;}                
        
        fputc(dir1,gtext);
            }
            else {fclose(open1_txt);    
                if ((open1_txt=fopen("1.txt","r"))== NULL) {
                                    printf("Error File 1.txt\n");
                                    system("pause");
                                    exit(1);
                                      }}

        }}
        
            void open2(void){    
        static        FILE *open2_txt;
if (open2_txt==NULL){  printf("aaa"); if ((open2_txt=fopen("2.txt","r"))== NULL) {
                                                                printf("Error File 2.txt\n");
                                                                system("pause");
                                                                exit(1);
                                                                  }}
                
                
            while(1){
                
                dir1=fgetc(open2_txt);
                 
                        if (!feof(open2_txt)){
                        if(dir1==';'){break;}                
                    
                    fputc(dir1,gtext);
                        }
                        else {fclose(open2_txt);    
                            if ((open2_txt=fopen("2.txt","r"))== NULL) {
                                                printf("Error File 2.txt\n");
                                                system("pause");
                                                exit(1);
                                                  }}

                    }}


Почему то работает. smile 

ув inside_pointer, а что *ifp = NULL то ifp чему равно тоже NULL?

Это сообщение отредактировал(а) bigturtle - 29.1.2009, 18:27
PM MAIL   Вверх
inside_pointer
Дата 29.1.2009, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

а что *ifp = NULL то ifp чему равно тоже NULL?

ну да вроде, т.к. она статическая то её значение после инициализации сохраняется таким, каким оно осталось после работы функции, функция вернёт NULL когда не сможет файл открыть на чтение, закрытие файлов в данном случае происходит само на main'овском return'е, но его можно встроить в функцию или разделить их одно в функцию другое наружу

PM MAIL   Вверх
math64
Дата 30.1.2009, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ты испльзуешь C или C++? если C, using std; не нужен, если C++ почему в остальном не пользоваться возможностями C++?
Код

// чистый C
void my_open(FILE* fout, FILE** fin, char* filename) {
  if(*fin==NULL){
     if ((*fin=fopen(filename,"r"))== NULL) {
       printf("Error File %s\n", filename);
       system("pause");
       exit(1);
    }
  }
  while(1){
    int dir1=fgetc(*fin);
    if (!feof(*fin)){
      if(dir1==';'){
        break;
      }                
      fputc(dir1,fout);
    }
    else {
      fclose(*fin);    
      if ((*fin=fopen("1.txt","r"))== NULL) {
        printf("Error File %s\n", filename);
        system("pause");
        exit(1);
      }
    }
  }
}

int main(int argc, char** argv) {
FILE* fout;
FILE* fin1, fin2;
fout = fopen("3.txt", "w");
fin1 = NULL;
fin2 = NULL;
...
my_open(fout, &fin1, "1.txt");
my_open(fout, &fin2, "2.txt");
...
}

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


Шустрый
*


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

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



я использую с, на eclipse видно просто не вычистил вверх.
PM MAIL   Вверх
bigturtle
Дата 5.2.2009, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 Спасибо всем
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.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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