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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
DimaAvatar
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 141
#1

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

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

пишу очередную учебную программу, и возник вопрос вопросов.
я открываю текстовый файл откуда построчно читаю фалы и считаю строки в которых встречается "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++
Привет, у меня есть файл с несколькими строками, я беру одну строку - проверяю на условие какое-то, если она подходит по условию - пишу в...

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

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

Открытие файла - C++
У меня есть файл в котором сначала хранится количество наименований файлов,а потом названия файлов 2! 1.txt! 2.txt! ! используются...

Открытие файла - C++
Здравствуйте, интересует вопрос, можно ли сделать так, чтобы программа открывала нужный файл (наприм. картинку), если можно то как?

Открытие файла на C++ - C++
Здравствуйте. Появился вопрос, если, допустим, писать батник, то для открытия файла нужно писать start (или open) &quot;Путь к файлу&quot;... А...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
1876 / 1274 / 290
Регистрация: 05.06.2014
Сообщений: 3,633
29.05.2016, 21:21     Повторное открытие файла #32
Цитата Сообщение от Unknownx Посмотреть сообщение
тут сразу возникает вопрос как у мр Renji, это могло идти
В первом посте внезапно //my_wire *array_wire_store = new my_wire[count];.
DimaAvatar
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 141
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
1876 / 1274 / 290
Регистрация: 05.06.2014
Сообщений: 3,633
29.05.2016, 21:36     Повторное открытие файла #36
Цитата Сообщение от Unknownx Посмотреть сообщение
не падало(имею ввиду проект)?
Очень просто. Во-первых, в коде из первого поста нет никаких вызовов pars_file.
Во-вторых, "чёрт его знает что может быть при проверке с потоком" применительно к Qt - плод вашего больного воображения. Особенно, принимая во внимание что реализацию STL Qt оставляет на совести внешнего компилятора. И нет, g++ тоже в нарушениях стандарта не замечен.
DimaAvatar
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 141
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
1876 / 1274 / 290
Регистрация: 05.06.2014
Сообщений: 3,633
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
Сообщений: 141
29.05.2016, 21:44  [ТС]     Повторное открытие файла #39
Renji, "Ошибка сегментирования (сделан дамп памяти)" ((

Добавлено через 1 минуту
Renji, спс за "QMAKE_CXXFLAGS += -std=c++11" но результат увы... надо будет эм.. я хз, голову чтоль включить )) все стереть и переписать )
Unknownx
Заблокирован
29.05.2016, 21:47     Повторное открытие файла #40
Цитата Сообщение от DimaAvatar Посмотреть сообщение
ведь для класса csample вообще не определен метод size.
ты прикалываешся?
Цитата Сообщение от Unknownx Посмотреть сообщение
size_t size(){
* * * * return arr.size();
* * }
DimaAvatar
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 21:48  [ТС]     Повторное открытие файла #41
Unknownx, отдельное спасибо за предложенные вариант, хм, то ли вечер и я туплю, то ли вечер и я туплю ))) но увы ) тож самое ))) не открывает второй раз файл
и еще вопрос. ну правда было бы оч оч интересно, кроме выделения памяти в конструкторе что еще плохого в моем коде? не, ну а че, мне жеж интересно
Unknownx
Заблокирован
29.05.2016, 21:50     Повторное открытие файла #42
DimaAvatar, рано тебе писать такие коды, рано(это моё мнение), почитай пару книжек по плюсам. Ты реально не понимаешь разницы между локальной и глобальной переменной, алоцирование памяти в конструкторе как и файловое чтение в конструкторе объекта - это зло в первой инстанции(ответ почему в тех же книжках)

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

Не по теме:

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



Добавлено через 59 секунд
DimaAvatar, я не хочу тебя обижать напротив хочу помочь, но кроме того чтобы писать увы ты должен что либо читать из литературы, так как пишешь уже глупость за глупостью.
DimaAvatar
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 21:51  [ТС]     Повторное открытие файла #43
Unknownx, да, я не внимательный. эм... ну тогда у меня единственный (правда уже второй вариант) 0 потому что эм.. несмотря на выделение памяти в векторе, она не занята ни какими данными? хотя.. эм, я бы все равно ожидал 5, а не 0 (
Unknownx
Заблокирован
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2016, 21:54     Повторное открытие файла
Еще ссылки по теме:

открытие файла - C++
ifstream is; cout&lt;&lt;endl&lt;&lt;&quot;Name file: &quot;; cin&gt;&gt;name; is.open(name, ios::binary); if(!is.is_open()) { ...

Открытие файла. - C++
Простите, а возможно ли сделать так: допустим я задаю вопрос в консоли: хотите открыть такой-то файл? если да - то он соответственно...

Открытие файла по команде - C++
Моей програмке очень нужна одна функция, а именно: получая команду от определенного компьютера открывать файл. То есть есть компьютеры 1 и...

Открытие Ini файла - C++
Есть файл в формате ini: bank1=Belarusbank currency1=USD buy1=3050 sell1=3055 bank2=Belinvestbank buy2=3045 sell2=3053 ...

Открытие и сохранение файла - C++
Привет всем, подскажыте как открыть файл в С++ без Опен диалога и как збереч его, при етом с файла нужно считать инфу. (Файл в форматие...


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

Или воспользуйтесь поиском по форуму:
DimaAvatar
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 21:54  [ТС]     Повторное открытие файла #45
Unknownx, эм... я прочитал две книги, шилдта и лафоре, первого даже несколько раз. обижаться? ))) неее. я очоч оч рад, что у меня из этой темы столько мыслей для размышлений... в основном правда о бренности бытия и о том, какой я плохой студент... ну, что вот такой вот я студент (может и хотел бы свалить все на преподавателей и институт, но боюсь это сильно делу не поможет)
Yandex
Объявления
29.05.2016, 21:54     Повторное открытие файла
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru