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

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

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

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

29.05.2016, 19:20. Просмотров 694. Ответов 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;... А...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kolya8920
8 / 8 / 2
Регистрация: 14.05.2010
Сообщений: 116
29.05.2016, 19:33     Повторное открытие файла #2
Все правильно. Программа зацикливается в первом while.
Unknownx
29.05.2016, 19:35
  #3

Не по теме:

Цитата Сообщение от DimaAvatar Посмотреть сообщение
while (file){
- while(!file.eof()) хотябы

DimaAvatar
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 19:39  [ТС]     Повторное открытие файла #4
kolya8920, эм? а почему она зацикливается? вроде нет. while (file) - доходит до последней строки и выходит из цикла. Нет?

Добавлено через 1 минуту
Unknownx, Спасибо, увы, но и Ваш вариант не исправил ситуацию ((
Renji
1823 / 1241 / 288
Регистрация: 05.06.2014
Сообщений: 3,551
29.05.2016, 19:39     Повторное открытие файла #5
Все работает. Но на всякий случай впилите cout<<endl в конец (сбросит буфер вывода).
kolya8920
8 / 8 / 2
Регистрация: 14.05.2010
Сообщений: 116
29.05.2016, 19:39     Повторное открытие файла #6
Смотри пост выше. У тебя получается, что цикл продолжается пока файл открыт. А должен продолжаться пока не встретится конец файла.
Renji
1823 / 1241 / 288
Регистрация: 05.06.2014
Сообщений: 3,551
29.05.2016, 19:40     Повторное открытие файла #7
Цитата Сообщение от kolya8920 Посмотреть сообщение
Смотри пост выше. У тебя получается, что цикл продолжается пока файл открыт.
Нет, этот цикл продолжается пока поток не вывесит флаг ошибки "дык нечего же больше читать, начальник!".
DimaAvatar
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 19:42  [ТС]     Повторное открытие файла #8
Renji, а впилить куда? в первый while? после него? после file.close()
вообще то я уже всяко попробовал ))) увы... то же самое.
Hikari
Хитрая блондиночка $)
1447 / 954 / 285
Регистрация: 21.12.2015
Сообщений: 3,798
29.05.2016, 19:43     Повторное открытие файла #9
Цитата Сообщение от DimaAvatar Посмотреть сообщение
откуда построчно читаю фалы
Я может не в свое дело лезу, но не лучше было бы тебе использовать бинарный файл с структурированными данными?
DimaAvatar
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 19:45  [ТС]     Повторное открытие файла #10
Hikari, эм, я уверен, что лучше ))) только я пока не знаю что такое бинарный файл с структурными данными, но сейчас пошукаю что это есть такое )))
просто эм.. подобный вариант открытия файлов я использовал уже несколько раз и оно всегда работало... пока не понадобилось открыть его больше одного раза. Но все равно спасибо )
Renji
1823 / 1241 / 288
Регистрация: 05.06.2014
Сообщений: 3,551
29.05.2016, 19:45     Повторное открытие файла #11
Цитата Сообщение от DimaAvatar Посмотреть сообщение
Renji, а впилить куда?
В конец программы.
Алсо, if(str.find("wire")!=std::string::npos) в 21 строчке и getline(file,str) в 20-й.
Unknownx
Заблокирован
29.05.2016, 19:50     Повторное открытие файла #12
DimaAvatar, прикрепи свой файл
Цитата Сообщение от DimaAvatar Посмотреть сообщение
goods.txt
, гляну как там
Цитата Сообщение от DimaAvatar Посмотреть сообщение
Спасибо, увы, но и Ваш вариант не исправил ситуацию ((
не исправляет ситуацию
DimaAvatar
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 19:52  [ТС]     Повторное открытие файла #13
Renji,
getline(file,str) в 20-й. и бббинго )))
спасибо )
DimaAvatar
0 / 0 / 0
Регистрация: 05.02.2014
Сообщений: 141
29.05.2016, 19:54  [ТС]     Повторное открытие файла #14
Unknownx, Да, был бы благодарен
Вложения
Тип файла: txt goods.txt (152 байт, 1 просмотров)
Unknownx
Заблокирован
29.05.2016, 20:21     Повторное открытие файла #15
DimaAvatar,
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
#include <string>
#include <fstream>
#include <sstream>
#include <iostream>
using namespace std;
 
 
int main(){
    string str;
    fstream file;
    file.open("goods.txt");
    if (!file.is_open()){
        cout<<"<Error open\n";
    } else {
        while (!file.eof()){
            file>>str;
            if (strstr(str.c_str(),"wire")){
                //++count;
                cout<<str<<"\n";
            }
        }
    }
    file.close();
    file.clear();//без сброса флагов ошибок рабоать не будет
 
    file.open("goods.txt");
    if (!file.is_open()){
        cout<<"<Error open\n";
    } else {
        while (!file.eof()){
            file>>str;
            if (strstr(str.c_str(),"wire")){
                //++count;
                cout<<str<<"\n";
            }
        }
    }
    return 0;
}
Добавлено через 1 минуту
Цитата Сообщение от Unknownx Посмотреть сообщение
file.clear();//без сброса флагов ошибок рабоать не будет
после close для повтороного использования вызывай ещё метод clear. Далее
Цитата Сообщение от DimaAvatar Посмотреть сообщение
if (!file){
- роверка должна быть такой
Цитата Сообщение от Unknownx Посмотреть сообщение
if (!file.is_open()){
Добавлено через 19 секунд
Цитата Сообщение от Unknownx Посмотреть сообщение
while (!file.eof()){
- как я и говорил изначально
Renji
1823 / 1241 / 288
Регистрация: 05.06.2014
Сообщений: 3,551
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).
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 нужен.

Renji
1823 / 1241 / 288
Регистрация: 05.06.2014
Сообщений: 3,551
29.05.2016, 20:28     Повторное открытие файла #18
Цитата Сообщение от Unknownx Посмотреть сообщение
после нашей утренней беседы даже не знаю как воспринимать сообщение, как сарказм или как согласие?
Как ненужность вызова clear, ибо уже встроено в open.
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++
Вложения
Тип файла: txt goods.txt (152 байт, 0 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2016, 20:29     Повторное открытие файла
Еще ссылки по теме:

открытие файла - 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++
Привет всем, подскажыте как открыть файл в С++ без Опен диалога и как збереч его, при етом с файла нужно считать инфу. (Файл в форматие...


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

Или воспользуйтесь поиском по форуму:
hoggy
6369 / 2587 / 452
Регистрация: 15.11.2014
Сообщений: 5,722
Завершенные тесты: 1
29.05.2016, 20:29     Повторное открытие файла #20
Цитата Сообщение от DimaAvatar Посмотреть сообщение
Идеи?
по какой то причине файл не был записан.
у вас в коде нет проверки на успех операции.
ну а дальше можно только гадать.
Yandex
Объявления
29.05.2016, 20:29     Повторное открытие файла
Ответ Создать тему
Опции темы

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