Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/40: Рейтинг темы: голосов - 40, средняя оценка - 4.80
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141

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

29.05.2016, 19:20. Показов 9665. Ответов 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; это так я произвожу отладку ))) так вот этот тест у меня не выводится в консоль, из чего я делаю вывод, что второй раз файл по какой то причине не открывается. Идеи? Спасибо, братья )
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.05.2016, 19:20
Ответы с готовыми решениями:

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

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

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

59
Заблокирован
29.05.2016, 20:31
Студворк — интернет-сервис помощи студентам
DimaAvatar, почему не исправлено?
Цитата Сообщение от DimaAvatar Посмотреть сообщение
if (!file){
?!

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

Не по теме:

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

0
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 20:38  [ТС]
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 попыток таки заходит в повторное открытие файла... хм
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
29.05.2016, 20:44
Цитата Сообщение от Unknownx Посмотреть сообщение
в новых компиляторах да в старых нет. С+11 поддерживают совсем новые IDE. Оставь тогда язвы при себе.
Поддержка Убунты (у ТС она) со "старыми компиляторами" 2011 года разлива, прекращена годика два тому назад.
Впрочем, мумии не обновляются.
Цитата Сообщение от Unknownx Посмотреть сообщение
DimaAvatar, почему не исправлено?
Если файл не открылся, open поднимает failbit, который в свою очередь и будет проверен в .if (!file).
0
Заблокирован
29.05.2016, 20:50
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;
            }
        }
Миниатюры
Повторное открытие файла   Повторное открытие файла  
0
29.05.2016, 20:54

Не по теме:

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

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

Не по теме:

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

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

Добавлено через 3 минуты
Unknownx, по посту 24. эм, извините, не уразумею... в чем тут ошибка?
0
Заблокирован
29.05.2016, 21:20
Цитата Сообщение от 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
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
29.05.2016, 21:21
Цитата Сообщение от Unknownx Посмотреть сообщение
тут сразу возникает вопрос как у мр Renji, это могло идти
В первом посте внезапно //my_wire *array_wire_store = new my_wire[count];.
0
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 21:23  [ТС]
Unknownx, эм, (это я сейчас без издевки или чего то еще) а в чем связь выделения памяти для динамич. массива и функции pars_file? стоит выделять память для массива в отдельной функции?

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

Добавлено через 1 минуту
Renji, я просто не до конца понимаю как выделения памяти может повлиять на вызов (или реализацию) метода класса.
0
Заблокирован
29.05.2016, 21:24
Я вот поправил проект, но буду честен такого плохого кода не видел давно, за чтение и выделение памяти в конструкторе я бы строго наказывал (очень строго, а лучше по законам шариата)
Вложения
Тип файла: zip thread1748914_proj.zip (78.6 Кб, 4 просмотров)
0
Заблокирован
29.05.2016, 21:31
Цитата Сообщение от 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-ть?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
29.05.2016, 21:36
Цитата Сообщение от Unknownx Посмотреть сообщение
не падало(имею ввиду проект)?
Очень просто. Во-первых, в коде из первого поста нет никаких вызовов pars_file.
Во-вторых, "чёрт его знает что может быть при проверке с потоком" применительно к Qt - плод вашего больного воображения. Особенно, принимая во внимание что реализацию STL Qt оставляет на совести внешнего компилятора. И нет, g++ тоже в нарушениях стандарта не замечен.
0
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 21:40  [ТС]
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++ или я.. эм.. путаюсь в показаниях?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
29.05.2016, 21:41
Цитата Сообщение от DimaAvatar Посмотреть сообщение
да, в конструкторе я выделял память, ок, а если так?
my_wire *array_wire_store = new my_wire[count];
Цитата Сообщение от DimaAvatar Посмотреть сообщение
Renji, т.е. есть предложение скомпилить в консоле g++ ?
И в pro файл кинуть QMAKE_CXXFLAGS += -std=c++11, чтобы закрыть вопрос поддержки C++11. А в консоли ничего компилировать не надо.
0
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 21:44  [ТС]
Renji, "Ошибка сегментирования (сделан дамп памяти)" ((

Добавлено через 1 минуту
Renji, спс за "QMAKE_CXXFLAGS += -std=c++11" но результат увы... надо будет эм.. я хз, голову чтоль включить )) все стереть и переписать )
0
Заблокирован
29.05.2016, 21:47
Цитата Сообщение от DimaAvatar Посмотреть сообщение
ведь для класса csample вообще не определен метод size.
ты прикалываешся?
Цитата Сообщение от Unknownx Посмотреть сообщение
size_t size(){
* * * * return arr.size();
* * }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.05.2016, 21:47

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

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

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

Повторное открытие окна
Здравствуйте, столкнулся с проблемой, у меня есть кнопка которая открывает другое окно по типу: Form2 f2 = new Form2(); f2.Show(); ...

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Альцгеймер и колоссальный объем вычислений
Programma_Boinc 08.08.2026
Альцгеймер и колоссальный объем вычислений Сейчас по направлению болезни Альцгеймера идет колоссальный объем вычислений. Это один из главных приоритетов проекта. Такой массовый наплыв задач. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru