Форум программистов, компьютерный форум CyberForum.ru

считывание строк из потока файлов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.81
yaku
 Аватар для yaku
1 / 1 / 0
Регистрация: 30.05.2009
Сообщений: 25
08.07.2011, 15:18     считывание строк из потока файлов #1
люди плз помогите разобраться. в конце компиляции выдает сообщение
"error C2228: left of '.close' must have class/struct/union". програмку писал по найденым примерам и той информации которую удалось освоить.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include "stdafx.h"
#include <iostream> 
#include <fstream> 
#include <iomanip> 
#include <conio.h>
using std::cout;
using namespace std;
void main()
{
    int in_spe[100];
        int in_res[100];
    int spe_buf[100];
    int res_buf[100];
    int UHV[100];
    int Z[100];
    int i=0;
    int N_UHV=23,N_Z=10;
    
    string file_name_spe= " ";
    string file_name_res= " ";
    
        ofstream out("c:\\read spe.txt", ios::app);
        
        for(int i=0; i<100 ;i++)
        {
            in_spe[i]=0;
            in_res[i]=0;
            spe_buf[i]=0;
            res_buf[i]=0;
            UHV[i]=0;
            Z[i]=0;
        }
    for(int j=0; j<100 ;j++)// определяем и считываем файлы из директории
        {   file_name_spe=j+".spe"; //создаю имена для считываемых файлов
            file_name_res=j+".res";
 
            for(int i=0; i<100 ;i++)//посимвольно считываем строки из файла *.spe
            {
                ifstream in_spe("file_name_spe");//объявляю поток для файла который определил в начале цикла 
                in_spe>>spe_buf[i];
                if (i==N_UHV)  UHV[i]=spe_buf[i]; 
            }
            for(int i=0; i<100 ;i++)//посимвольно считываем строки из файла *.res
            {
                ifstream in_res("file_name_res");//та же процедура как и в предыдущем цикле
                in_res>>spe_buf[i];
                if (i==N_Z)  Z[i]=res_buf[i]; //делаю выборку нужных данных по номеру строки 
            }
 
    cout<<setw(5)<<UHV[N_UHV]<<Z[N_Z]<<endl;//вывод в файл 
        }
        cout <<"\n\n press any key for continue "<<endl;
        getch ();
        in_spe.close();//закрываем потоки
                in_res.close();
        out.close(); 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2011, 15:18     считывание строк из потока файлов
Посмотрите здесь:

считывание потока чисел C++
Считывание из файлов C++
Считывание с потока ввода C++
C++ Считывание символа с потока для дальнейших действий
C++ Считывание из стандартного потока ввода
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
08.07.2011, 15:28     считывание строк из потока файлов #2
yaku, у тебя потоки называются точно также как и массивы. Попробуй дать другое название.

Добавлено через 1 минуту
Вообще можно не закрывать потоки т.к. они автоматически закрываются при выходе

Добавлено через 1 минуту
Цитата Сообщение от yaku Посмотреть сообщение
using std::cout;
using namespace std;
если ты уже используешь пространство имен стд то строчка using std::cout; ни к чему
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
08.07.2011, 15:29     считывание строк из потока файлов #3
А в данном конкретном случае входные потоки закрываются в конце каждой итерации соответствующих циклов. И по-новой открываются в начале следующей итерации.
yaku
 Аватар для yaku
1 / 1 / 0
Регистрация: 30.05.2009
Сообщений: 25
08.07.2011, 15:53  [ТС]     считывание строк из потока файлов #4
Цитата Сообщение от Mayonez Посмотреть сообщение
у тебя потоки называются точно также как и массивы
значит что то недочитал :/ масивы я определил
C++
1
2
3
4
5
6
 int in_spe[100];
        int in_res[100];
        int spe_buf[100];
        int res_buf[100];
        int UHV[100];
        int Z[100];
и обнулил их в цикле, мне так посоветовали сделать. я запутался, по поводу одинаковых названий масивов и потоков. если правильно понимаю суть проблемы в строчках
C++
1
2
using std::cout;
using namespace std;
. можно маленький ликбез по этому вопросу, по книжным примерам немогу понять
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
08.07.2011, 16:12     считывание строк из потока файлов #5
Цитата Сообщение от yaku Посмотреть сообщение
и обнулил их в цикле, мне так посоветовали сделать. я запутался, по поводу одинаковых названий масивов и потоков. если правильно понимаю суть проблемы в строчках
нет-нет-нет.
смотри: ты обьявляешь массив:
C++
1
2
int in_spe[100];
int in_res[100];
а потом поток с таким же именем:

C++
1
ifstream in_spe("file_name_spe");
in_spe и in_res

вот компилятор и путается...
смени названия потоком или массивов.
Также можно просто убрать ети строчки:
C++
1
2
3
in_spe.close();//закрываем потоки
                in_res.close();
                out.close();
yaku
 Аватар для yaku
1 / 1 / 0
Регистрация: 30.05.2009
Сообщений: 25
08.07.2011, 17:01  [ТС]     считывание строк из потока файлов #6
спасибо, стало ясней. я действительно создал лишние масивы, после этого все пошло без глюков. ошибка которую заметил в первый раз была связана именно с тем что после завершения цикла потоки автоматически закрывались, а я еще раз закрывал получается те которые даже не обьявлял ))
подправил "конструкцию", убрал лишнее, теперь удивлюясь результатам. считывание данных из файлов дает заглавную строчку и "0" (вывожу на экран), а в файле пустота. убрал цикл обнуления масива, появились цифры на экране, файл снова пустой. для контроля хотел сделать вывод имени файла, из которого идет считывание, создав масив символьных данных, ругается :/ где опять ошибся.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "stdafx.h"
#include <iostream> 
#include <fstream> 
#include <iomanip> 
#include <conio.h>
using std::cout;
using namespace std;
void main()
  {
    int spe_buf[100];
    int res_buf[100];
    int UHV[100];
    int Z[100];
    int i=0;
    int N_UHV=50,N_Z=60;
    //char name_res[200];
    
    string file_name_spe= " ";
    string file_name_res= " ";
    ofstream out("c:\\read spe.txt", ios::app);
    cout<<"№"<<setw(7)<<"UHV"<<setw(3)<<"Z"<<endl;
//      for(int y=0; y<100 ;y++) // обнуляем масив
//      {
//          spe_buf[y]=0;
//          res_buf[y]=0;
//          UHV[y]=0;
//          Z[y]=0;
//      }
    for(int j=1; j<10 ;j++)// определяем и считываем файлы из директории
        {   file_name_spe=j+".spe";
            //name_res[y]=file_name_res;
            file_name_res=j+".res";
 
            for(int i=0; i<100 ;i++)//посимвольно считываем строки из файла *.spe
            {
                ifstream in_spe("file_name_spe");
                in_spe>>spe_buf[i];
                if (i==N_UHV)  UHV[i]=spe_buf[i]; 
            }
            for(int i=0; i<100 ;i++)//посимвольно считываем строки из файла *.res
            {
                ifstream in_res("file_name_res");
                in_res>>spe_buf[i];
                if (i==N_Z)  Z[i]=res_buf[i]; 
            }
                         cout<<setw(3)<<j<<setw(4)<<UHV[N_UHV]<<setw(4)<<Z[N_Z]<<endl;
        }
        cout <<"\n\n press any key for continue "<<endl;
        getch ();
  }
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
08.07.2011, 17:53     считывание строк из потока файлов #7
что програма должна делать?
yaku
 Аватар для yaku
1 / 1 / 0
Регистрация: 30.05.2009
Сообщений: 25
08.07.2011, 18:08  [ТС]     считывание строк из потока файлов #8
есть директория в которой находяться файлы (200-300шт), разных расширений (spe,res). файлы имеют сплошную нумерацию, т..е 1.spe, 1.res
2.spe, 2.res
3.spe, 3.res
..... .....
200.spe, 200.res
в каждом файле колонка с численными значениями, условно, каждая строка колонки -параметр. моя задача считать нужые строки с параметрами (числами) ,зная их номер, и записать в новый файл. результат записываемый в конечный файл формируеться из данных взятых из файлов одинакового номера, это значит что я должен выполнять обработку с условием считывания сначала 1.res (spe) потом 2.res(spe),3.res(spe) и т.д.
yaku
 Аватар для yaku
1 / 1 / 0
Регистрация: 30.05.2009
Сообщений: 25
13.07.2011, 16:27  [ТС]     считывание строк из потока файлов #9
исправил, дополнил, немного подсмотрел )) програмка работает но результат опять корявый. после завершения работы в файл записывает "0" для строчек в которых точно должны быть другие цифры. просмотрите код, он ниже . подозреваю что из-за неопытности упускаю что-то при организации обработки найденных файлов...все те же потоки>>>ifstream in_1("c_file.name");<<<
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include "stdafx.h"
#include <stdio.h>
#include <io.h>
#include <time.h>
#include <iomanip> 
#include <conio.h>
#include <iostream> 
#include <fstream> 
using std::setw;
using std::cout;
using namespace std;
ofstream out("result_zol.txt", ios::trunc);
    int ar_time[200];
    int ar_DataT[200];
    int ar_1[200];
//  char f_name[256];   
int main( void )
{   for(int i=0; i<100 ;i++)
        {
            ar_1[i]=0;
        }
    struct _finddata_t c_file;
    intptr_t hFile;
   if( (hFile = _findfirst( "*.txt", &c_file )) == -1L )//
      printf( "No *.txt files in current directory!\n" );
   else
        out<<"  i"<<setw(8)<<"time"<<setw(8)<<"DataT"<<setw(8)<<"name"<<endl;
        cout<<"c_file.name"<<"  "<<setw(20)<<"buffer"<<setw(20)<<"c_file.size"<<"\n"<<endl;
      do {
            char buffer[100];
            ctime_s( buffer, _countof(buffer), &c_file.time_write );
            printf( "%-12s        %.20s     %2ld\n",c_file.name, buffer, c_file.size );
        for(int i=1; i<11 ;i++)//посимвольно считываем из файла ПОТОКА ФАЙЛОВ
            {
                ifstream in_1("c_file.name");
                in_1>>ar_1[i];
                if (i==2)  ar_time[i]=ar_1[i];// записали  данные о длительности измерения
                if (i==3) ar_DataT[i]=ar_1[i];// записали  данные о времени измерения
                out<<setw(3)<<i<<setw(7)<<ar_time[i]<<setw(7)<<ar_DataT[i]<<setw(10)<<c_file.name<<endl;
            }   out<<"\n";
        } 
    while(_findnext( hFile, &c_file ) == 0 );
          _findclose( hFile );
          out.close(); 
    getch ();
}
привожу обычное содержимое файла "result_zol.txt"

i time DataT name
1 0 0 1.txt
2 0 0 1.txt
3 0 0 1.txt
4 0 0 1.txt
5 0 0 1.txt

я обрабатываю файлы в которых строчки с нужными параметрами содержат не нулевые значения соответственно столбцы time и DataT должны содержать цифры отличные от "0".
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
13.07.2011, 16:45     считывание строк из потока файлов #10
Что ж, повторю свою мысль ещё раз.
В строке 35 на первой итерации (i==1) создаётся in_1 и открывается файл "c_file.name". Но уже в конце первой итерации, где-то в районе строки 40 объект in_1 разрушается и файл закрывается. На следующей итерации (i == 2) объект создаётся заново и снова открывается файл. И так далее.
yaku
 Аватар для yaku
1 / 1 / 0
Регистрация: 30.05.2009
Сообщений: 25
13.07.2011, 17:26  [ТС]     считывание строк из потока файлов #11
я поток в цикле не закрываю, следовательно у меня как минимум один файл должен обработаться, т.е. первые 10 чисел должны быть разные в столбиках,а этого не происходит.
какие могут быть трудности если я перед каждым циклом считывания поток "меняю"? имя файла меняеться (c_file.name) соответсвенно поток привязывается к нему, значит все сделал по правилам.
откуда ж нули???????



не сплю, не ем....... глаза выпадают
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
13.07.2011, 17:31     считывание строк из потока файлов #12
Да он сам закрывается, потому что разрушается объект in_1.
Создание объекта in_1 надо вынести из цикла по i.
yaku
 Аватар для yaku
1 / 1 / 0
Регистрация: 30.05.2009
Сообщений: 25
13.07.2011, 17:37  [ТС]     считывание строк из потока файлов #13
Цитата Сообщение от grizlik78 Посмотреть сообщение
Что ж, повторю свою мысль ещё раз.
по поводу мысли )) в последнем сообщении мысль потерял повторись будь добр, авось осенит

Добавлено через 6 минут
вынес,ничего не поменялось.я правильно организовал считывание из файла? может что-то упустил?
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
13.07.2011, 17:48     считывание строк из потока файлов #14
Если я правильно понял, то никакого файла с именем "c_file.name" нет? Имелось в виду переменная что ли?
C++
1
ifstream in_1(c_file.name);
И неплохо бы проверять, открылся ли файл.
C++
1
2
3
4
5
6
ifstream in_1(c_file.name);
if (!in_1)
{
    std::cerr << "Can't open file " << c_file.name << std::endl;
    // тут можно выход забабахать, или ещё какую обработку
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2011, 18:26     считывание строк из потока файлов
Еще ссылки по теме:

Считывание до конца потока в числовой массив C++
C++ Считывание строки из потока, не удаляя символ-ограничитель
C++ Считывание до конца входного потока

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
yaku
 Аватар для yaku
1 / 1 / 0
Регистрация: 30.05.2009
Сообщений: 25
13.07.2011, 18:26  [ТС]     считывание строк из потока файлов #15
c_file.name ---- переменная и я очевидно напутал с синтаксисом когда взял в кавычки.
по алгоритму программы используя переменную c_file.name (спасибо что поправил) и читаю файл называние которого присвоено "c_file.name". но убрав кавычки все осталось как и было (


надо передохнуть

Добавлено через 18 минут
свершилось!!!!! убрал косяки и заработало. все советы были дельные, я с переменными намудрил из-за этого много упустил.

огромное спасибо grizlik78
Yandex
Объявления
13.07.2011, 18:26     считывание строк из потока файлов
Ответ Создать тему
Опции темы

Текущее время: 14:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru