Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

29.05.2016, 19:20. Просмотров 978. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2016, 19:20
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Повторное открытие файла (C++):

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

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

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

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

как может корректно выполняющийся оператор >> (чтение из текстового файла) негативно влиять на открытие другого файла? - C++
Друзья! Создадим два текстовых файла, f_0.txt и f_1.txt и что-нибудь в них запизаем, например в первый запихаем 1234 а во второй 5678 и...

Чтение из файла. Повторное чтение файла - C++
Добрый день. Необходимо реализовать в программе функцию повторного чтения данных из файла, в случае некорректного ввода их в оный. Вот...

59
Renji
2117 / 1476 / 347
Регистрация: 05.06.2014
Сообщений: 4,300
29.05.2016, 20:24 #16
Цитата Сообщение от Unknownx Посмотреть сообщение
без сброса флагов ошибок рабоать не будет
std::ifstream::open - "The function clears the stream's state flags on success (setting them to goodbit)." (да, да, в C++11).
0
Unknownx
29.05.2016, 20:27
  #17

Не по теме:

Цитата Сообщение от Renji Посмотреть сообщение
std::ifstream::open - "The function clears the stream's state flags on success (setting them to goodbit)." (да, да, в C++11).
после нашей утренней беседы даже не знаю как воспринимать сообщение, как сарказм или как согласие?Холиворить не хочу, clear нужен.

0
Renji
2117 / 1476 / 347
Регистрация: 05.06.2014
Сообщений: 4,300
29.05.2016, 20:28 #18
Цитата Сообщение от Unknownx Посмотреть сообщение
после нашей утренней беседы даже не знаю как воспринимать сообщение, как сарказм или как согласие?
Как ненужность вызова clear, ибо уже встроено в open.
0
DimaAvatar
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 20:29  [ТС] #19
ммм. попробовал все это реализовать в своей программе, ну то что было изначально это укороченная выжимка... в ней работает, а в итоговой программе нет. увы (((
main.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
#include <iostream>
#include <cstdio>
 
#include <string>
#include <sstream>
#include <vector>
#include <iostream>
#include <algorithm>
 
#include "wire.h"
//#include "switches.h"
 
using namespace std;
void choise_menu();
void sklad();
 
int main (){
 
    setlocale(LC_ALL,"");
    for (int i=0;i<77;i++){
        cout<<"=";
    }
    cout<<"\n= Программа складского учета электротехнической продукции "
          "ООО Рога и копыта = ";
 
    cout<<"\n";
    for (int i=0;i<77;i++){
        cout<<"=";
    }
    cout<<"\n";
 
 
 
    choise_menu();
 
    cin.get();
    return 0;
}
 
void choise_menu(){
    cout<<"Выберете пункт меню программы:\n 1-посмотреть остатки товара\n 2-внести поступление товара\n 3-выдача товара со склада\n";
    string count;
    getline(std::cin, count);
    if (count == "1") sklad();  //имхо в сравнение с такой конструкцие switch отдыхает
    else if(count == "2") sklad();
    else if (count == "3") sklad();
    else {cout<<"проверьте правильность ввода пункта меню \n";choise_menu();}
 
}
 
void sklad(){
    wire obj1;
}
goods.h
goods.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef GOODS_H
#define GOODS_H
#include <iostream>
#include <fstream>
using namespace std;
class goods { // класс абстрактный т.к. содержит чистую виртальную функцию
    public:
    goods(){};
    ~goods(){};
    virtual void show () = 0;//чистая виртуальная функция
  //  virtual void add () = 0;//чистая виртуальная функция
};
#endif // GOODS_H
wire.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef WIRE_H
#define WIRE_H
#include "goods.h"
using namespace std;
class wire:public goods {
    private:
    int count;
    struct my_wire{
        string number;
        string product;
        string brand;
        float amount;
    }wire_store;
 
    my_wire *array_wire_store;
 
    public:
    wire();
    void pars_file(string&,int&);
    void add();
    void show();
};
#endif // WIRE_H
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
#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){
        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){
        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";
    }
 
}
проблема с wire.cpp не заходит сволочь во второе открытие файла. гляньте если не сложно.
ubuntu 14 g++
0
Вложения
Тип файла: txt goods.txt (152 байт, 0 просмотров)
hoggy
6858 / 3059 / 525
Регистрация: 15.11.2014
Сообщений: 6,944
Завершенные тесты: 1
29.05.2016, 20:29 #20
Цитата Сообщение от DimaAvatar Посмотреть сообщение
Идеи?
по какой то причине файл не был записан.
у вас в коде нет проверки на успех операции.
ну а дальше можно только гадать.
0
Unknownx
Заблокирован
29.05.2016, 20:31 #21
DimaAvatar, почему не исправлено?
Цитата Сообщение от DimaAvatar Посмотреть сообщение
if (!file){
?!

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

Не по теме:

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

0
DimaAvatar
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 141
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 попыток таки заходит в повторное открытие файла... хм
0
Renji
2117 / 1476 / 347
Регистрация: 05.06.2014
Сообщений: 4,300
29.05.2016, 20:44 #23
Цитата Сообщение от Unknownx Посмотреть сообщение
в новых компиляторах да в старых нет. С+11 поддерживают совсем новые IDE. Оставь тогда язвы при себе.
Поддержка Убунты (у ТС она) со "старыми компиляторами" 2011 года разлива, прекращена годика два тому назад.
Впрочем, мумии не обновляются.
Цитата Сообщение от Unknownx Посмотреть сообщение
DimaAvatar, почему не исправлено?
Если файл не открылся, open поднимает failbit, который в свою очередь и будет проверен в .if (!file).
0
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;
            }
        }
0
Миниатюры
Повторное открытие файла   Повторное открытие файла  
Unknownx
29.05.2016, 20:54
  #25

Не по теме:

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

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

Не по теме:

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

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

Добавлено через 3 минуты
Unknownx, по посту 24. эм, извините, не уразумею... в чем тут ошибка?
0
29.05.2016, 21:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2016, 21:17
Привет! Вот еще темы с ответами:

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

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

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

открытие файла - 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()) { ...


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

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

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