Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Открытие файла на чтение функция fopen


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

 
Код

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);
                                      }}


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

Автор: destrd 27.1.2009, 21:59
передавайте ей открытый файл как параметр, как вариант.

Автор: bigturtle 27.1.2009, 22:04
В смысле? есть еще такойвриант
Код

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);
                                      }}

Автор: math64 28.1.2009, 09:44
Так нельзя. после объявления 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;
}

Автор: bigturtle 28.1.2009, 11:15
Не знаю компилятор обрабатывает, и все работает только при больших  количества переписывания файла вылетает Error File 1.txt\n.
В вашем варианте тоже при вызове функции файл будет заново открываться, а мне нужно, что бы он читался если уже открыт. 

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

Автор: math64 28.1.2009, 13:06
Код

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);
}
}

Автор: inside_pointer 29.1.2009, 01:16
Код

 
#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;
}

Автор: bigturtle 29.1.2009, 18:26
Вот остановился на врианте
Код


#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?

Автор: inside_pointer 29.1.2009, 22:26
Цитата

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

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

Автор: math64 30.1.2009, 10:02
Ты испльзуешь 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");
...
}

Автор: bigturtle 30.1.2009, 13:06
я использую с, на eclipse видно просто не вычистил вверх.

Автор: bigturtle 5.2.2009, 12:37
 Спасибо всем

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)