На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> fopen???
    Можно ли одновременно открывать несколько *.txt файлов(fopen) и одновременно работать с ними.

    Я сделал 2 цикла: один для работы с одним файлом и вложенный для работы с другим. По идее как только вывелась строчка первого файла за ней выводятся все строчки второго. Да первый раз срабатывает все нормально выводится первая строка первого файла а за ним все второго.
    НО последущие разы выводятся только строки первого файла.
    Скорей всего надо переводить в конце прочтения второй файл на начало,
    но как только я пытаюсь выполнить fseek(fl_now,0,SEEK_SET) для второго файла, то все зацикливается???

    вот код:

    #include "stdafx.h"
    #include <iostream.h>
    #include <string.h>
    #include <stdio.h>
    #include <conio.h>

    #define star "c:\\11.txt\0"
    #define now "c:\\22.txt\0"


    int main(int argc, char* argv[])
    {
    char file_star[20] = star;
    char file_now[20] = now;
    char buf1[512],buf2[512];
    FILE *fl_star, *fl_now;
    int k,kk;
    char staraja[10];
    char nowaja[10];
    int i,ii;
    long pos, pos_now;
    fl_star = fopen(file_star,"r");
    if(!fl_star){return 0;}
    fl_now = fopen(file_now,"r");
    if(!fl_now){return 0;}
    while((k = getc(fl_star)) != EOF)
    {
    if((char)k =='@')
    {
    pos = ftell(fl_star);
    fseek(fl_star,(pos - 1),SEEK_SET);
    fgets(buf1,strlen(buf1),fl_star);
    i = 0;
    while((int)buf1[i]!=44)
    {
    staraja[i] = buf1[i];
    cout<<"staraja[i]=" << staraja[i];
    i++;
    }
    cout<<"\n";
    while((kk = getc(fl_now)) != EOF)
    {
    if((char)kk =='@')
    {
    pos_now = ftell(fl_now);
    fseek(fl_now,(pos_now - 1),SEEK_SET);
    fgets(buf2,strlen(buf2),fl_now);
    ii=0;
    while((int)buf2[ii]!=44)
    {
    nowaja[ii] = buf2[ii];
    cout<< "nowaja[ii]"<<nowaja[ii];
    ii++;
    }
    cout<<"\n";
    }
    }
    }
    }
    fclose(fl_star);
    fclose(fl_now);
    return 0;
    }

    Текстовые файлы:
    Содержимое первого: "c:\\11.txt\0"

    @T031,"пкупкупцоуцо",
    @T032,"ьпвьпвпьговл",
    @T033,"ьпчьрыеьыгел",
    @T035,"ьпрпвьроглгнлуглглн",
    @T036,"прьвпьвгоннвлнглл",

    и второго: "c:\\22.txt\0"

    @T031,"vwbwtgbtgrbhnewn",
    @T032,"twhhtwht",
    @T033,"bwrtbtwt44tb4h",
    @T035,"q4eth45hthtrwhtrh",
    @T036,"betbhqtrehnyrrnhn ",
      M
      Для вставки кода просьба пользоваться тегами [ CODE ]...[ /CODE ] (без пробелов), либо кнопкой «Code» на панели отправки сообщения. Иначе код становится неудобочитаем, особенно в случаях большого количества вложенных блоков.
        #include "stdafx.h"
        #include <iostream.h>
        #include <string.h>
        #include <stdio.h>
        #include <conio.h>

        #define star "c:\\11.txt\0"
        #define now "c:\\22.txt\0"


        int main(int argc, char* argv[])
        {
        char file_star[20] = star;
        char file_now[20] = now;
        char buf1[512],buf2[512];
        FILE *fl_star, *fl_now;
        int k,kk;
        char staraja[10];
        char nowaja[10];
        int i,ii;
        long pos, pos_now;
        fl_star = fopen(file_star,"r");
        if(!fl_star){return 0;}
        fl_now = fopen(file_now,"r");
        if(!fl_now){return 0;}
        while((k = getc(fl_star)) != EOF)
        {
        if((char)k =='@')
        {
        pos = ftell(fl_star);
        fseek(fl_star,(pos - 1),SEEK_SET);
        fgets(buf1,strlen(buf1),fl_star);
        i = 0;
        while((int)buf1[i]!=44)
        {
        staraja[i] = buf1[i];
        cout<<"staraja[i]=" << staraja[i];
        i++;
        }
        cout<<"\n";
        while((kk = getc(fl_now)) != EOF)
        {
        if((char)kk =='@')
        {
        pos_now = ftell(fl_now);
        fseek(fl_now,(pos_now - 1),SEEK_SET);
        fgets(buf2,strlen(buf2),fl_now);
        ii=0;
        while((int)buf2[ii]!=44)
        {
        nowaja[ii] = buf2[ii];
        cout<< "nowaja[ii]"<<nowaja[ii];
        ii++;
        }
        cout<<"\n";
        }
        }
        }
        }
        fclose(fl_star);
        fclose(fl_now);
        return 0;
        }
        ExpandedWrap disabled
           
        ExpandedWrap disabled
           
        [CODE]
          Код вставлять надо между
          ExpandedWrap disabled
             здесь код!
          а не перед :)

          Так вот. Действительно, надо ставить указатель на начало файла. И покажи пожалуйса, как ты это делаешь, что у тебя все зацикливается?
          Сообщение отредактировано: DarkKo -
            Цитата
            mak8, 18.01.04, 12:46
            fgets(buf1,strlen(buf1),fl_star);
            Это неправильно.

            Цитата
            mak8, 18.01.04, 12:46
            fgets(buf2,strlen(buf2),fl_now);
            Это тоже.


            Цитата
            mak8, 18.01.04, 12:46
            pos_now = ftell(fl_now);
            fseek(fl_now,(pos_now - 1),SEEK_SET);
            Это можно заменить на fseek(fl_now,-1,SEEK_CUR);

            Цитата
            mak8, 18.01.04, 12:46
            pos = ftell(fl_star);
            fseek(fl_star,(pos - 1),SEEK_SET);
            Это тоже. :)

            Возможно и еще что найдется при надлежащем оформлении. ;)
              ExpandedWrap disabled
                #include "stdafx.h"
                #include <iostream.h>
                #include <string.h>
                #include <stdio.h>
                #include <conio.h>
                 
                #define star "c:\\11.txt\0"
                #define now "c:\\22.txt\0"
                 
                 
                int main(int argc, char* argv[])
                {
                    char file_star[20] = star;
                    char file_now[20] = now;
                    char buf1[512],buf2[512];
                    FILE *fl_star, *fl_now;
                    int k,kk;
                    char staraja[10];
                    char nowaja[10];
                    int i,ii;
                    long pos, pos_now;
                    fl_star = fopen(file_star,"r");
                    if(!fl_star){return 0;}
                    fl_now = fopen(file_now,"r");
                    if(!fl_now){return 0;}
                    while((k = getc(fl_star)) != EOF)
                    {
                        if((char)k =='@')
                        {
                           pos = ftell(fl_star);
                           fseek(fl_star,(pos - 1),SEEK_SET);
                           fgets(buf1,strlen(buf1),fl_star);
                           i = 0;
                           while((int)buf1[i]!=44)
                           {
                              staraja[i] = buf1[i];
                              cout<<"staraja[i]=" << staraja[i];
                              i++;
                           }
                           cout<<"\n";
                           while((kk = getc(fl_now)) != EOF)
                           {
                              if((char)kk =='@')
                              {
                                 pos_now = ftell(fl_now);
                                 fseek(fl_now,(pos_now - 1),SEEK_SET);
                                 fgets(buf2,strlen(buf2),fl_now);
                                 ii=0;
                                 while((int)buf2[ii]!=44)
                                 {
                                    nowaja[ii] = buf2[ii];
                                    cout<< "nowaja[ii]="<<nowaja[ii]<<"\n";
                                    ii++;
                                 }
                                 cout<<"\n";
                              }
                           }
                 
                 
                          
                           //êàê òîëüêî óñòàíàâëèâàþ íà íà÷àëî:
                           fseek(fl_now,0,SEEK_SET);
                        }
                    }
                    fclose(fl_star);
                    fclose(fl_now);
                    return 0;
                }



              a в цикле следущее:

              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=n
              nowaja[ii]=e
              nowaja[ii]=w
              nowaja[ii]=n
              nowaja[ii]="

              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=
              nowaja[ii]=n
              nowaja[ii]=e
              nowaja[ii]=w
              nowaja[ii]=n
              nowaja[ii]="

              и.т.д.

              Добавлено в :
              А чего не верно?

              char buf1[512]
              FILE *fl_star
              fgets(buf1,strlen(buf1),fl_star);

              :D
                Цитата
                mak8, 18.01.04, 13:17
                А чего не верно?
                strlen - это не размер буфера, а длина строки. Во время выполнения сначала в массиве может находиться все, что угодно, соответственно strlen вернет что-то бессмысленное. Затем в последующих итерациях цикла там будет оставаться строка из предыдущей итерации. Надо писать или просто числовую константу(в Вашем случае это 512), или sizeof(имя_массива)
                Кроме того, явно возможен выход за пределы массивов staraja и nowaja с последующим крахом если не всей системы, то программы точно.
                Я не понимаю смысла действий. Видимо это просто тестовая программа. Тогда что-то вроде такого:
                ExpandedWrap disabled
                   
                  #include "stdafx.h"
                  #include <iostream.h>
                  #include <string.h>
                  #include <stdio.h>
                  #include <conio.h>
                   
                  #define star "c:\\11.txt\0"
                  #define now "c:\\22.txt\0"
                   
                   
                  int main(int argc, char* argv[])
                  {
                     char buf1[512],buf2[512];
                     FILE *fl_star, *fl_now;
                     int k,kk;
                     char staraja[10];
                     char nowaja[10];
                     int i,ii;
                     long pos, pos_now;
                     fl_star = fopen(star,"r");
                     if(!fl_star){return 0;}
                     fl_now = fopen(now,"r");
                     if(!fl_now){return 0;}
                     while((k = getc(fl_star)) != EOF)
                     {
                        if(k == '@')
                        {
                           fseek(fl_star,-1,SEEK_CUR);
                           fgets(buf1,sizeof(buf1),fl_star);
                           for( i=0 ; buf1[i]!=',' ; i++ )
                           {
                              cout<<"staraja[i]=" << buf1[i]<<endl;
                           }
                           cout<<"\n";
                           while((kk = getc(fl_now)) != EOF)
                           {
                              if((char)kk =='@')
                              {
                                 fseek(fl_now,-1,SEEK_CUR);
                                 fgets(buf2,sizeof(buf2),fl_now);
                                 for( ii=0 ; buf2[ii]!=',' ; ii++ )
                                 {
                                    cout<< "nowaja[ii]="<<buf2[ii]<<endl;
                                 }
                                 cout<<"\n";
                              }
                           }
                           fseek(fl_now,0,SEEK_SET);
                        }
                     }
                     fclose(fl_now);
                     fclose(fl_star);
                     return 0;
                  }
                Хотя некоторые вещи можно бы сделать пооптимальнее.
                P.S. Работоспособность не проверял, т.к. смысл некоторых действий мне не понятен. :)
                Сообщение отредактировано: trainer -
                  Спасибо за помощь.
                  Все работает.
                  :D
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0365 ]   [ 16 queries used ]   [ Generated: 2.05.24, 10:08 GMT ]