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

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

Восстановить пароль Регистрация
 
 
DimaAvatar
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 134
29.05.2016, 19:20     Повторное открытие файла #1
пишу очередную учебную программу, и возник вопрос вопросов.
я открываю текстовый файл откуда построчно читаю фалы и считаю строки в которых встречается "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; это так я произвожу отладку ))) так вот этот тест у меня не выводится в консоль, из чего я делаю вывод, что второй раз файл по какой то причине не открывается. Идеи? Спасибо, братья )
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2016, 19:20     Повторное открытие файла
Посмотрите здесь:

Открытие файла. C++
открытие файла Си++ C++
Открытие файла C++
C++ Повторное открытие файла через классы
C++ Записать в файл g, компоненты файла f, исключив повторное вхождения чисел
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Unknownx
Заблокирован
29.05.2016, 20:31     Повторное открытие файла #21
DimaAvatar, почему не исправлено?
Цитата Сообщение от DimaAvatar Посмотреть сообщение
if (!file){
?!

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

Не по теме:

Цитата Сообщение от Renji Посмотреть сообщение
Как ненужность вызова clear, ибо уже встроено в open.
в новых компиляторах да в старых нет. С+11 поддерживают совсем новые IDE. Оставь тогда язвы при себе.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DimaAvatar
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 134
29.05.2016, 20:38  [ТС]     Повторное открытие файла #22
hoggy, эм, я пока не пишу в файл, я только считываю с него.. с записью это будет второй том - "прошу помощи" пока справиться бы с первым..

Добавлено через 46 секунд
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
#include "wire.h"
#include <cstring>
#include <fstream>
 
wire::wire(){
    int local_count = 0;
    count = -1;
    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();//без сброса флагов ошибок рабоать не будет
 
    my_wire *array_wire_store = new my_wire[count];// выделяем память под необходимое кол-во товарных позиций
 
    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";
    }
 
}
Добавлено через 3 минуты
какая то "плавающая" дрочь.. по другому не назвать. в 1 из 10 попыток таки заходит в повторное открытие файла... хм
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
29.05.2016, 20:44     Повторное открытие файла #23
Цитата Сообщение от Unknownx Посмотреть сообщение
в новых компиляторах да в старых нет. С+11 поддерживают совсем новые IDE. Оставь тогда язвы при себе.
Поддержка Убунты (у ТС она) со "старыми компиляторами" 2011 года разлива, прекращена годика два тому назад.
Впрочем, мумии не обновляются.
Цитата Сообщение от Unknownx Посмотреть сообщение
DimaAvatar, почему не исправлено?
Если файл не открылся, open поднимает failbit, который в свою очередь и будет проверен в .if (!file).
Unknownx
Заблокирован
29.05.2016, 20:50     Повторное открытие файла #24
DimaAvatar, да у тебя там креш в проге конкретно в твоей функции pars_file а ты постишь увы увы
Цитата Сообщение от DimaAvatar Посмотреть сообщение
while (!file.eof()){
* * * * * * getline(file,str);
* * * * * * if (strstr(str.c_str(),"wire")){
* * * * * * * * pars_file(str,local_count);
* * * * * * }
* * * * }
C++
1
2
3
4
5
6
7
 while (!file.eof()){
            getline(file,str);
            if (strstr(str.c_str(),"wire")){
                //pars_file(str,local_count);
                cout<<str<<endl;
            }
        }
Миниатюры
Повторное открытие файла   Повторное открытие файла  
Unknownx
29.05.2016, 20:54
  #25

Не по теме:

Цитата Сообщение от Renji Посмотреть сообщение
Если файл не открылся, open поднимает failbit, который в свою очередь и будет проверен в .if (!file).
- во превых у ТС
Цитата Сообщение от DimaAvatar Посмотреть сообщение
QT_CPP
стоит QT о внутренней реализации стандартных интерфейсов которого ты не имеешь ни малейшего представления(т.е чёрт его знает что может быть при проверке с потоком, НО дело оказалось прозаичней у человека креш), во вторых
Цитата Сообщение от Renji Посмотреть сообщение
Поддержка Убунты (у ТС она) со "старыми компиляторами" 2011 года разлива, прекращена годика два тому назад.
- это ты телепатией занялся мне просто интересно что натолкнуло тебя на то что у ТС убунта?
Ну ну, молодчага, теперь прочти малость о стримах
Лучше бы загнал код в отладчик, а не пытался меня неумело потролить(очень неумело)(!)

Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
29.05.2016, 20:57     Повторное открытие файла #26
Цитата Сообщение от Unknownx Посмотреть сообщение
- это ты телепатией занялся?
Это было сказано в 19 посте. Впрочем, уже даже по /home/ очевидно что у него Линукс. И я слабо себе представляю где вы откопаете Линукс 2011 года, с еще живой поддержкой.
Ну а в отладчик я этот код совал, все работает.
Unknownx
Заблокирован
29.05.2016, 21:04     Повторное открытие файла #27
Цитата Сообщение от Renji Посмотреть сообщение
Ну а в отладчик я этот код совал, все работает.
конечно 10-rf VisualStudio упала просто так и Dev-C++ 5.8 тоже
Миниатюры
Повторное открытие файла  
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
29.05.2016, 21:05     Повторное открытие файла #28
Цитата Сообщение от Unknownx Посмотреть сообщение
конечно 10-rf VisualStudio упала просто так и Dev-C++ 5.8 тоже
Поправка - я совал код содержащий if (!file), приведенный в первом посте. За тем что там позже нахимичили особо не следил.
Unknownx
29.05.2016, 21:07
  #29

Не по теме:

Цитата Сообщение от Renji Посмотреть сообщение
Поправка - я совал код содержащий if (!file), приведенный в первом посте. За тем что там позже нахимичили особо не следил.
- оййй ойййй

DimaAvatar
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 134
29.05.2016, 21:17  [ТС]     Повторное открытие файла #30
креш? эм? это от слова трэш? ))) что есть креш? ага... после Ваших обсуждений у меня пока только один вопрос что есть креш ))

Добавлено через 3 минуты
Unknownx, по посту 24. эм, извините, не уразумею... в чем тут ошибка?
Unknownx
Заблокирован
29.05.2016, 21:20     Повторное открытие файла #31
Цитата Сообщение от DimaAvatar Посмотреть сообщение
креш? эм? это от слова трэш? ))) что есть креш? ага... после Ваших обсуждений у меня пока только один вопрос что есть креш ))
- значит падает программа в pars_file(string&str,int& local_count) конкретно в функции pars_file подает потмоу что память ты выделяешь локально здесь
Цитата Сообщение от DimaAvatar Посмотреть сообщение
my_wire *array_wire_store = new my_wire[count];
, а обращаться пытаешся к полю класса my_wire *array_wire_store; (тут сразу возникает вопрос как у мр Renji, это могло идти, ну да ладно в его полном незнании и голословии я продолжаю убеждаться

Добавлено через 1 минуту
Далее, какого чёрта счётчик строк стоит с инициализацией -1
Цитата Сообщение от DimaAvatar Посмотреть сообщение
count = -1;
?Если в файле будет 2 строки с wire то count будет == 1 а надо выделить память под два элемента, инит там должен быть 0
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
29.05.2016, 21:21     Повторное открытие файла #32
Цитата Сообщение от Unknownx Посмотреть сообщение
тут сразу возникает вопрос как у мр Renji, это могло идти
В первом посте внезапно //my_wire *array_wire_store = new my_wire[count];.
DimaAvatar
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 134
29.05.2016, 21:23  [ТС]     Повторное открытие файла #33
Unknownx, эм, (это я сейчас без издевки или чего то еще) а в чем связь выделения памяти для динамич. массива и функции pars_file? стоит выделять память для массива в отдельной функции?

Добавлено через 41 секунду
Renji, да, изначально оно было закоменчено и сейчас если комментить, то эм, увы на результат это не влияет, проверил

Добавлено через 1 минуту
Renji, я просто не до конца понимаю как выделения памяти может повлиять на вызов (или реализацию) метода класса.
Unknownx
Заблокирован
29.05.2016, 21:24     Повторное открытие файла #34
Я вот поправил проект, но буду честен такого плохого кода не видел давно, за чтение и выделение памяти в конструкторе я бы строго наказывал (очень строго, а лучше по законам шариата)
Вложения
Тип файла: zip thread1748914_proj.zip (78.6 Кб, 3 просмотров)
Unknownx
Заблокирован
29.05.2016, 21:31     Повторное открытие файла #35
Цитата Сообщение от DimaAvatar Посмотреть сообщение
(это я сейчас без издевки или чего то еще) а в чем связь выделения памяти для динамич. массива и функции pars_file?
в том что ты в своей функции обращаешся к полю класса, а внутри контруктора выделяешь память для локального массива, в результате при первом обращении к полю класса array_wire_store будет креш(падение), по причине выхода за пределы отведенной памяти(которой вообще не было выделено)

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

Не по теме:

Renji, а теперь скажи мне каким образом у тебя

Цитата Сообщение от Renji Посмотреть сообщение
Поправка - я совал код содержащий if (!file), приведенный в первом посте. За тем что там позже нахимичили особо не следил.
не падало(имею ввиду проект)?



Добавлено через 3 минуты
Цитата Сообщение от DimaAvatar Посмотреть сообщение
я просто не до конца понимаю как выделения памяти может повлиять на вызов (или реализацию) метода класса.
- показываю что ты делал простым примером(проведи аналогию с массивом)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <vector>
#include <iostream>
using namespace std;
 
class csample{
    vector< int > arr;
    public:
    csample(){
        vector< int > arr;//єто локальная переменная не имеющая отношение к csample::arr
        arr.resize(5);
    }
    size_t size(){
        return arr.size();
    }
};
 
int main(){
    csample sample;
    cout<<sample.size()<<endl;
    return 0;
}
http://codepad.org/F5omt1RI
Задайся вопросом почему вывод 0 а не 5-ть?
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
29.05.2016, 21:36     Повторное открытие файла #36
Цитата Сообщение от Unknownx Посмотреть сообщение
не падало(имею ввиду проект)?
Очень просто. Во-первых, в коде из первого поста нет никаких вызовов pars_file.
Во-вторых, "чёрт его знает что может быть при проверке с потоком" применительно к Qt - плод вашего больного воображения. Особенно, принимая во внимание что реализацию STL Qt оставляет на совести внешнего компилятора. И нет, g++ тоже в нарушениях стандарта не замечен.
DimaAvatar
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 134
29.05.2016, 21:40  [ТС]     Повторное открытие файла #37
Unknownx, вопросом задался ))) но ответа не нашел )) в приведенном в Вашем примере я вообще не понимаю почему прошла компиляция )))
C++
1
2
,
cout<<sample.size()<<endl;
ведь для класса csample вообще не определен метод size.

да, в конструкторе я выделял память, ок, а если так?

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";
    }
 
}
тут я выделяю память в отдельной функции, это будет верно?

Добавлено через 1 минуту
Renji, т.е. есть предложение скомпилить в консоле g++ ? эм, сейчас попробую, но думаю результат будет тот же, ведь у QT нет своего компилятора и в настройках прописан g++ или я.. эм.. путаюсь в показаниях?
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
29.05.2016, 21:41     Повторное открытие файла #38
Цитата Сообщение от DimaAvatar Посмотреть сообщение
да, в конструкторе я выделял память, ок, а если так?
my_wire *array_wire_store = new my_wire[count];
Цитата Сообщение от DimaAvatar Посмотреть сообщение
Renji, т.е. есть предложение скомпилить в консоле g++ ?
И в pro файл кинуть QMAKE_CXXFLAGS += -std=c++11, чтобы закрыть вопрос поддержки C++11. А в консоли ничего компилировать не надо.
DimaAvatar
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 134
29.05.2016, 21:44  [ТС]     Повторное открытие файла #39
Renji, "Ошибка сегментирования (сделан дамп памяти)" ((

Добавлено через 1 минуту
Renji, спс за "QMAKE_CXXFLAGS += -std=c++11" но результат увы... надо будет эм.. я хз, голову чтоль включить )) все стереть и переписать )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2016, 21:47     Повторное открытие файла
Еще ссылки по теме:

C++ Открытие файла на C++
C++ Открытие файла
C++ Повторное чтение файла

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

Или воспользуйтесь поиском по форуму:
Unknownx
Заблокирован
29.05.2016, 21:47     Повторное открытие файла #40
Цитата Сообщение от DimaAvatar Посмотреть сообщение
ведь для класса csample вообще не определен метод size.
ты прикалываешся?
Цитата Сообщение от Unknownx Посмотреть сообщение
size_t size(){
* * * * return arr.size();
* * }
Yandex
Объявления
29.05.2016, 21:47     Повторное открытие файла
Ответ Создать тему
Опции темы

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