0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
1

Повторное открытие файла

29.05.2016, 19:20. Показов 7635. Ответов 59
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
пишу очередную учебную программу, и возник вопрос вопросов.
я открываю текстовый файл откуда построчно читаю фалы и считаю строки в которых встречается "wire" по кол-ву таких строк выделяю память в динамическом массиве и готовлюсь снова открыть файл и произвести запись в массив структур. проблема во втором открытие файла. компилируется все ок, но не срабатывает что то.

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
#include <iostream>
#include <cstring>
#include <fstream>
 
using namespace std;
 
 
int main () {
 
    int local_count = 0;
    int count = -1;
    string str;
    ifstream file;
 
    file.open("/home/dima/QT_CPP/for_st/goods.txt");//здесь указать свой путь к файлу
    if (!file){
        cout<<"<База данных не обнаружена проверьте верность указания пути\n";
    } else {
        while (file){
            file>>str;
            if (strstr(str.c_str(),"wire")){
                ++count;
               // cout<<str<<"\n";
            }
        }
    }
    file.close();
 
 
    //my_wire *array_wire_store = new my_wire[count];// выделяем память под необходимое кол-во товарных позиций
 
    file.open("/home/dima/QT_CPP/for_st/goods.txt");//здесь указать свой путь к файлу
    if (!file){
        cout<<"<База данных не обнаружена проверьте верность указания пути\n";
    } else {
        while (file){
            cout<<"test";
            file>>str;
            if (strstr(str.c_str(),"wire")){
                //pars_file(str,local_count);
            }
        }
 
    }
    file.close();
 
}
в строке 38 у меня cout<<"test; это так я произвожу отладку ))) так вот этот тест у меня не выводится в консоль, из чего я делаю вывод, что второй раз файл по какой то причине не открывается. Идеи? Спасибо, братья )
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2016, 19:20
Ответы с готовыми решениями:

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

Повторное чтение файла
Привет, у меня есть файл с несколькими строками, я беру одну строку - проверяю на условие какое-то,...

Записать в файл g, компоненты файла f, исключив повторное вхождения чисел
Дан файл f, компоненты которого являются целыми числами. Записать в файл g, компоненты файла f,...

Почему после считывания матрицы из файла начинается повторное считывание?
Здравствуйте. ПРоблема такова, считывает размер матрицы и саму матрицу, после успешного считвания...

59
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 21:48  [ТС] 41
Author24 — интернет-сервис помощи студентам
Unknownx, отдельное спасибо за предложенные вариант, хм, то ли вечер и я туплю, то ли вечер и я туплю ))) но увы ) тож самое ))) не открывает второй раз файл
и еще вопрос. ну правда было бы оч оч интересно, кроме выделения памяти в конструкторе что еще плохого в моем коде? не, ну а че, мне жеж интересно
0
Заблокирован
29.05.2016, 21:50 42
DimaAvatar, рано тебе писать такие коды, рано(это моё мнение), почитай пару книжек по плюсам. Ты реально не понимаешь разницы между локальной и глобальной переменной, алоцирование памяти в конструкторе как и файловое чтение в конструкторе объекта - это зло в первой инстанции(ответ почему в тех же книжках)

Добавлено через 54 секунды

Не по теме:

Цитата Сообщение от DimaAvatar Посмотреть сообщение
Unknownx, отдельное спасибо за предложенные вариант, хм, то ли вечер и я туплю, то ли вечер и я туплю ))) но увы ) тож самое ))) не открывает второй раз файл
- да там проект рабочий, ехе собранный, прости но ты реально сейчас тупишь причём как говорят "не по детски"



Добавлено через 59 секунд
DimaAvatar, я не хочу тебя обижать напротив хочу помочь, но кроме того чтобы писать увы ты должен что либо читать из литературы, так как пишешь уже глупость за глупостью.
0
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 21:51  [ТС] 43
Unknownx, да, я не внимательный. эм... ну тогда у меня единственный (правда уже второй вариант) 0 потому что эм.. несмотря на выделение памяти в векторе, она не занята ни какими данными? хотя.. эм, я бы все равно ожидал 5, а не 0 (
0
Заблокирован
29.05.2016, 21:54 44
Цитата Сообщение от DimaAvatar Посмотреть сообщение
Renji, "Ошибка сегментирования (сделан дамп памяти)" ((
- потому что Renji, не анализируя код не внял моему совету
Цитата Сообщение от Unknownx Посмотреть сообщение
Далее, какого чёрта счётчик строк стоит с инициализацией -1
Сообщение от DimaAvatar
count = -1;
?Если в файле будет 2 строки с wire то count будет == 1 а надо выделить память под два элемента, инит там должен быть 0
, а ты его слушаешь не понимая реально у кого тут есть знания а у кого их мало.

Добавлено через 1 минуту
Цитата Сообщение от DimaAvatar Посмотреть сообщение
хотя.. эм, я бы все равно ожидал 5, а не 0 (
- да ё-моё тут же написано
Цитата Сообщение от Unknownx Посмотреть сообщение
vector< int > arr;//arr - это локальная переменная не имеющая отношение к csample::arr
0
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 21:54  [ТС] 45
Unknownx, эм... я прочитал две книги, шилдта и лафоре, первого даже несколько раз. обижаться? ))) неее. я очоч оч рад, что у меня из этой темы столько мыслей для размышлений... в основном правда о бренности бытия и о том, какой я плохой студент... ну, что вот такой вот я студент (может и хотел бы свалить все на преподавателей и институт, но боюсь это сильно делу не поможет)
0
Заблокирован
29.05.2016, 21:56 46
DimaAvatar, скажи ты не можешь собрать уже готовый проект из поста 34?Не понимаю в чём проблема?
0
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 22:00  [ТС] 47
Unknownx,
а) count я уже сменил и сообщение о дампе я получил уже после этого
б) с моим багажом... я буду слушать всех, это удел начинающих и это нормально. я кстати ни чего плохого в его советах не увидел.
в)аааа size_t size() не видит vector< int > arr; если это так и вы проводите аналогию с local_count т.е. предалается вынести ее в поле класса?
в свое оправдание могу лишь сказать, что она (Local_count) осталась внаследство от первой попытки написать программу, и тогда она и правда задумывалась как локальная.
г) я так и не разобрался как отвечать с циитированием ))) но знайте я Вам оч благодарен )
0
Заблокирован
29.05.2016, 22:07 48

Не по теме:

DimaAvatar, как говорят в медицине, я сделал, что от меня требовалось, далее уже дело пациента.

Цитата Сообщение от DimaAvatar Посмотреть сообщение
я буду слушать всех, это удел начинающих и это нормально.
- это не всегда приводит к нужному результату. Я могу конечно сейчас под VMware собарть твой проект под убунтой(можешь приклеить, только в архиве а не кусками кода), но что то мне подсказывает ты правил у себя вместо того, чтобы просто распаковать зип да собрать нормально.



Добавлено через 2 минуты
Цитата Сообщение от DimaAvatar Посмотреть сообщение
если это так и вы проводите аналогию с local_count
- нет я проводил аналогию с выделением памяти
Цитата Сообщение от DimaAvatar Посмотреть сообщение
my_wire *array_wire_store = new my_wire[count];
local_count как раз идёт по ссылке и там всё ок
1
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
29.05.2016, 22:10 49
Цитата Сообщение от DimaAvatar Посмотреть сообщение
Unknownx, эм... я прочитал две книги, шилдта и лафоре, первого даже несколько раз.
Теперь советую почитать про отладчик. Для Qt:
1) Сделать дебаг-сборку.
2) Кнопочкой F10 выполнить одну строчку. Кнопочкой F11 - тоже самое, только с заскоком в потроха функции из этой строчки.
3) F5 - запустить программу до ближайшего бряк-поинта.
4) F9 поставить бряк-поинт.
5) В окошке справа зырить содержимое переменных.

Вот так, двигаясь по шажочку, и разберетесь чего глючит. Плюс, указатели объявлять не как my_wire *array_wire_store;, а как my_wire *array_wire_store=nullptr;. Да, вот так внутри объявления класса и писать. В C++11 разрешили. Плюс, агрессивно распихивать assert по всем углам.
0
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 22:11  [ТС] 50
Unknownx, Спасибо большое, за помощь и участие... мне нужно время понять что у Вас так сильно отличается от моего варианта. но да, если не копировать текст кода файла "wire.cpp" (что я сделал первый раз) а именно собрать из Вашего... работает. что меня радует как бэ... но и печалит то же )))
Миниатюры
Повторное открытие файла  
0
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 22:18  [ТС] 51
братья, спасибо, Вы мне очень помогли... эм, моя коробочка переполненна... я если можно чз пару тройкау дней реанимирую тему, мне надо время собрать воедино... я вообще не быстро в программировании соображаю. жаль, ну ))) наверное у меня есть какие то другие положительные моменты )) еще раз спасибо...

Добавлено через 1 минуту
Renji, отладчик QT м... это то, с чем да, мне предстоит разобраться, яуже пару раз пытался подступиться к этому зверю... но пока проект отладки пугает меня больше чем дед бабай в детстве.. (да чего уж там я и сейчас его побаиваюсь)

Добавлено через 2 минуты
Renji,
"Плюс, указатели объявлять не как my_wire *array_wire_store;, а как my_wire *array_wire_store=nullptr;"
а я указатель объявлял да? эм.. ну я по примеру делал типа int *temp=new int[N]; (тип указатель имя = new тип [размер])

а.... вы про объявление... ну да ))) я еще и в терминалогии могу запутаться... все понял

хм, хотя я проверил... и my_wire*array_wire_store и my_wire * array_wire_store = nullptr; работают... в общем работают оба варианта )
0
Заблокирован
29.05.2016, 22:21 52
DimaAvatar, прикрепи в тему wire.cpp я покажу что конкретно у тебя не так, прям по строчкам
0
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 22:25  [ТС] 53
Unknownx, не подскажите, а почему в Вашем варианте... эм, array_wire_store = new my_wire[count]; то же в конструкторе?

Добавлено через 1 минуту
wire.cpp (Ваш)
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
58
59
60
61
62
63
64
65
#include "wire.h"
#include <string>
#include <fstream>
using namespace std;
 
wire::wire(){
    int local_count = 0;
    count = 0;
    string str;
    ifstream file;
 
    file.open("/home/dima/QT_CPP/for_st_2/for_st/goods.txt");//çäåñü óêàçàòü ñâîé ïóòü ê ôàéëó
    if (!file.is_open()){
        cout<<"<Áàçà äàííûõ íå îáíîðóæåííà ïðîâåðüòå âåðíîñòü óêàçàíèÿ ïóòè\n";
    } else {
        while (!file.eof()){
            getline(file,str);
            if (strstr(str.c_str(),"wire")){
                ++count;
            }
        }
    }
 
    file.close();
    file.clear();//áåç ñáðîñà ôëàãîâ îøèáîê ðàáîàòü íå áóäåò
 
    /*my_wire **/array_wire_store = new my_wire[count];// âûäåëÿåì ïàìÿòü ïîä íåîáõîäèìîå êîë-âî òîâàðíûõ ïîçèöèé
 
    file.open("/home/dima/QT_CPP/for_st_2/for_st/goods.txt");//çäåñü óêàçàòü ñâîé ïóòü ê ôàéëó
    if (!file.is_open()){
        cout<<"<Áàçà äàííûõ íå îáíîðóæåííà ïðîâåðüòå âåðíîñòü óêàçàíèÿ ïóòè\n";
    } else {
        cout<<"the begin";//ìàðêåð
        while (!file.eof()){
            getline(file,str);
            if (strstr(str.c_str(),"wire")){
                pars_file(str,local_count);
                cout<<str<<endl;
            }
        }
 
    }
    file.close();
 
}
 
void wire :: pars_file(string&str,int& local_count){
    string temp_str = str;
    if (strstr(str.c_str(),"wire")){
        array_wire_store[local_count].number = temp_str.substr(0,temp_str.find(';')).c_str();
        array_wire_store[local_count].product = temp_str.substr(0,temp_str.find(';')).c_str();
        array_wire_store[local_count++].brand = temp_str.substr(0,temp_str.find(';')).c_str();
    }
    cout<<"the end";//ìàðêåð
 
}
 
 
void wire::show(){
 
    for (unsigned int i = 0; i<(sizeof(array_wire_store)/sizeof(my_wire));++i){
        cout<<array_wire_store[i].number<<array_wire_store[i].product<<"\n";
    }
 
}
wire.cpp (мой)
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "wire.h"
#include <cstring>
#include <fstream>
 
wire::wire(){
    int local_count = 0;
    count = 0;
    string str;
    ifstream file;
 
    file.open("/home/dima/QT_CPP/for_st/goods.txt");//здесь указать свой путь к файлу
    if (!file.is_open()){
        cout<<"<База данных не обноруженна проверьте верность указания пути\n";
    } else {
        while (!file.eof()){
            getline(file,str);
            if (strstr(str.c_str(),"wire")){
                ++count;
            }
        }
    }
 
    file.close();
 
    while ( cin.get() != '\n' );
 
    file.clear();//без сброса флагов ошибок рабоать не будет
 
    memmory_allocate();
 
    file.open("/home/dima/QT_CPP/for_st/goods.txt");//здесь указать свой путь к файлу
 
    if (!file.is_open()){
        cout<<"<База данных не обноруженна проверьте верность указания пути\n";
    } else {
        cout<<"the begin";//маркер
        while (!file.eof()){
            getline(file,str);
            if (strstr(str.c_str(),"wire")){
                pars_file(str,local_count);
            }
        }
 
    }
    file.close();
 
}
 
void wire :: pars_file(string&str,int& local_count){
    string temp_str = str;
    if (strstr(str.c_str(),"wire")){
        array_wire_store[local_count].number = temp_str.substr(0,temp_str.find(';')).c_str();
        array_wire_store[local_count].product = temp_str.substr(0,temp_str.find(';')).c_str();
        array_wire_store[local_count++].brand = temp_str.substr(0,temp_str.find(';')).c_str();
    }
    cout<<"the end";//маркер
 
}
 
void wire::memmory_allocate(){
    my_wire *array_wire_store = new my_wire[count];// выделяем память под необходимое кол-во товарных позиций
}
 
 
void wire::show(){
 
    for (unsigned int i = 0; i<(sizeof(array_wire_store)/sizeof(my_wire));++i){
        cout<<array_wire_store[i].number<<array_wire_store[i].product<<"\n";
    }
 
}
0
Заблокирован
29.05.2016, 22:27 54

Не по теме:

Цитата Сообщение от DimaAvatar Посмотреть сообщение
array_wire_store = new my_wire[count]; то же в конструкторе?
- ну как бы да, там просто перед array_wire_store вытерет тип и указатель, которые делали array_wire_store из поля класса локальным массивом. Я не переписывал твой код я только поправил проверку на открытость, счётчик count и сделал array_wire_store не локальным(возьми два файла и в блокноте сравни)



Добавлено через 1 минуту
Цитата Сообщение от DimaAvatar Посмотреть сообщение
while ( cin.get() != '\n' );
к чему оно?
Цитата Сообщение от DimaAvatar Посмотреть сообщение
memmory_allocate();
- что это?
Цитата Сообщение от DimaAvatar Посмотреть сообщение
my_wire *array_wire_store
- ну опять же локалка
/*my_wire **/array_wire_store = new my_wire[count];
- вот аллокация для поля класса
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
29.05.2016, 22:28 55
Цитата Сообщение от DimaAvatar Посмотреть сообщение
хм, хотя я проверил... и my_wire*array_wire_store и my_wire * array_wire_store = nullptr; работают... в общем работают оба варианта )
Работать то работают, но в первом варианте сложнее ловить случай "забыл инициализировать array_wire_store". Во втором же случае если вы про инициализацию забыли, в указателе будет ноль. И это сразу бросится в глаза как в сообщениях о ошибках (что-то в духе "не могу читать по адресу 0x00000002"), так и в отладчике.
1
Заблокирован
29.05.2016, 22:29 56
DimaAvatar, бери свой изначальный wire.cpp
Цитата Сообщение от DimaAvatar Посмотреть сообщение
wire::wire(){
* * int local_count = 0;
* * count = 0;
* * string str;
* * ifstream file;
file.open("/home/dima/QT_CPP/for_st/goods.txt");//здесь указать свой путь к файлу
* * if (!file.is_open()){
* * * * cout<<"<База данных не обноруженна проверьте верность указания пути\n";
* * } else {
* * * * while (!file.eof()){
* * * * * * getline(file,str);
* * * * * * if (strstr(str.c_str(),"wire")){
* * * * * * * * ++count;
* * * * * * }
* * * * }
* * }
file.close();
- тут всё ок
Цитата Сообщение от DimaAvatar Посмотреть сообщение
while ( cin.get() != '\n' );
- убери
Цитата Сообщение от DimaAvatar Посмотреть сообщение
memmory_allocate();
-верни как было но вот так
array_wire_store = new my_wire[count]; далее всё ок. memmory_allocate убери к чёрту.
1
Заблокирован
29.05.2016, 22:31 57
Файлы когда просят прикрепляют вот так
Миниатюры
Повторное открытие файла  
0
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 22:35  [ТС] 58
Unknownx, чет я ни фига не понял.... и? я сделал как Вы сказали и заработало... так оно ж у меня уже было ??? чет я совсем потерялся.
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
58
59
60
61
62
63
64
65
66
67
68
69
#include "wire.h"
#include <cstring>
#include <fstream>
 
wire::wire(){
    int local_count = 0;
    count = 0;
    string str;
    ifstream file;
 
    file.open("/home/dima/QT_CPP/for_st/goods.txt");//здесь указать свой путь к файлу
    if (!file.is_open()){
        cout<<"<База данных не обноруженна проверьте верность указания пути\n";
    } else {
        while (!file.eof()){
            getline(file,str);
            if (strstr(str.c_str(),"wire")){
                ++count;
            }
        }
    }
 
    file.close();
 
    file.clear();//без сброса флагов ошибок рабоать не будет
 
    array_wire_store = new my_wire[count];
 
    //memmory_allocate();
 
    file.open("/home/dima/QT_CPP/for_st/goods.txt");//здесь указать свой путь к файлу
 
    if (!file.is_open()){
        cout<<"<База данных не обноруженна проверьте верность указания пути\n";
    } else {
        cout<<"the begin";//маркер
        while (!file.eof()){
            getline(file,str);
            if (strstr(str.c_str(),"wire")){
                pars_file(str,local_count);
            }
        }
 
    }
    file.close();
 
}
 
void wire :: pars_file(string&str,int& local_count){
    string temp_str = str;
    if (strstr(str.c_str(),"wire")){
        array_wire_store[local_count].number = temp_str.substr(0,temp_str.find(';')).c_str();
        array_wire_store[local_count].product = temp_str.substr(0,temp_str.find(';')).c_str();
        array_wire_store[local_count++].brand = temp_str.substr(0,temp_str.find(';')).c_str();
    }
    cout<<"the end";//маркер
 
}
 
 
 
 
void wire::show(){
 
    for (unsigned int i = 0; i<(sizeof(array_wire_store)/sizeof(my_wire));++i){
        cout<<array_wire_store[i].number<<array_wire_store[i].product<<"\n";
    }
 
}
п.с. ну кроме 27 строчки конечно
Миниатюры
Повторное открытие файла  
0
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 22:38  [ТС] 59
дааа я файлы то прикрепляю.. но эм, почему то с моими cpp форум не хочет работать, не подгружает их пишет - не корректный файл
Миниатюры
Повторное открытие файла  
0
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 23:00  [ТС] 60
Unknownx, ааааа
"ну опять же локалка" вы имете в виду что в моем изначальном варианте я локально просто вводил новую переменную и выделял для нее память, а потом пытался записать данные (но уже в др методе класса) в массив глобальный, для которого память не была виделена, т.к. я выделял ее для локального массива (хоть и с таким же именем) дааааа?

Добавлено через 18 минут
братья )) спасибо Вам еще раз. я тааакой довольный, как после первого секса ))) я прям влюбляюсь в форум, как тут много разных добрых людей которые объясняют мне все эти затырк, я ни когда не думал, что люди вот так вот будут отвечать и носиться со мной - посылаю Вам положительные эмоции чз космос. May the Force be with you.
0
29.05.2016, 23:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.05.2016, 23:00
Помогаю со студенческими работами здесь

Как запретить повторное открытие файла fopen()?
Здравствуйте. Такой вопрос - открываю файл с помощью fopen(), как сделать так чтобы никакой другой...

Повторное открытие формы
Здравствуйте, private void показатьАлфавитToolStripMenuItem_Click(object sender, EventArgs e) ...

Повторное открытие окна
Здравствуйте, столкнулся с проблемой, у меня есть кнопка которая открывает другое окно по типу: ...

Повторное открытие savefiledialog
Не знаю в чем проблема, раньше подобного с обычными файлами не было, в общем сохраняю я файл docx ...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru