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

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

Войти
Регистрация
Восстановить пароль
 
vaselo
19 / 19 / 1
Регистрация: 17.10.2010
Сообщений: 247
#1

Файл. Потоки - C++

24.01.2012, 21:52. Просмотров 672. Ответов 15
Метки нет (Все метки)

Здравствуйте, необходимо читать из файла числа, пользуясь потоками. Найдя максимальное число - затереть его пробелами. как мне быть?(не занося все числа в массив и не выводя заново массива в файл без макс. числа)

Добавлено через 13 минут
пока накидал только это, а вот как удалять - раз, два - не происходит вывод на экран перем. biggest, и КАК ПЕРЕМЕЩАТЬСЯ К СЛЕД. ЧИСЛУ В ФАЙЛЕ??
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
int _tmain(int argc, _TCHAR* argv[])
{
    fstream fs;
    fs.open("file.txt");
            if(fs.is_open())//Если удачно открыли
            {
                float biggest;
                fs>>biggest;
                float c;
                cout<<"File opened succesfully\n";
                 while(fs.good())
                 {
                     fs>>c;
                     if(c>biggest)biggest=c;
                     cout<<biggest;
                 }
            }
else
    {
        cout<<"Error. File can not be opened\n";
        system("pause");
        return 0;
    }
system("pause");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2012, 21:52     Файл. Потоки
Посмотрите здесь:

Файл и потоки - C++
Слово - произвольная последовательность непустых символов. Длину слов в файле ничем неограничено. Вывести все слова из текста на экран по...

Запись в файл через потоки - C++
fstream file; ... cout&lt;&lt;&quot;Введите - имя файла.dat:&quot;&lt;&lt;endl; cin&gt;&gt;fname; file.open(fname,...

Потоки, критические секции, запись в файл - C++
Есть задание: с использованием критических секций написать функции по добавлению в список строки и поиску строки, ну и все это вывести на...

Потоки ввода/вывода: дважды скопировать исходный файл - C++
Когда пытаюсь побайтно копировать из одного файла в другой - всё работает. А вот если попытаться ДВА раза скопировать исходный файл , то...

Как используя потоки читать файл пропуская текстовые вставки - C++
Есть поток привязанный к файлу на чтение и запись. Каждая строка в файле имеет формат: сс:мм:чч дд.мм.гггг text1 = XXX1 text2 = XXX2...

Потоки - C++
Есть некоторая консольная программа. Необходимо обернуть ее в гуи, то есть самого консольного окна быть не должно. Как я понял это проще...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
24.01.2012, 21:53     Файл. Потоки #2
Проходите по файлу, находите максимальное число, его позицию и затираете.
fstream
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
24.01.2012, 22:01     Файл. Потоки #3
Цитата Сообщение от vaselo Посмотреть сообщение
Найдя максимальное число - затереть его пробелами
Задавался этим вопросом уже, насчёт удаления данных из файла мне так и не ответили и посоветовали переписать в другой файл результат. Такой вариант подойдёт?
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
24.01.2012, 22:02     Файл. Потоки #4
soon, а как насчёт этого самого затирания, ты на самый интересный вопрос не ответил.
vaselo
19 / 19 / 1
Регистрация: 17.10.2010
Сообщений: 247
24.01.2012, 22:02  [ТС]     Файл. Потоки #5
Цитата Сообщение от Gepar Посмотреть сообщение
Задавался этим вопросом уже, насчёт удаления данных из файла мне так и не ответили и посоветовали переписать в другой файл результат. Такой вариант подойдёт?
да, спасибо
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
24.01.2012, 22:12     Файл. Потоки #6
Цитата Сообщение от Gepar Посмотреть сообщение
soon, а как насчёт этого самого затирания, ты на самый интересный вопрос не ответил.
Дак так же, как и тут, не?
vaselo
19 / 19 / 1
Регистрация: 17.10.2010
Сообщений: 247
24.01.2012, 22:14  [ТС]     Файл. Потоки #7
чего-то не могу читать числа в переменную:
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
// file.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <fstream>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    fstream fs;
    fs.open("file.txt");
            if(fs.is_open())//Если удачно открыли
            {
                int biggest;
                fs>>biggest;
                float c;
                cout<<"File opened succesfully\n";
                 while(fs.eof())
                 {
                     fs>>c;
                     if(c>biggest)biggest=c;
                     cout<<biggest;
                     c=fs.tellg();
                 }
            }
else
    {
        cout<<"Error. File can not be opened\n";
        system("pause");
        return 0;
    }
system("pause");
}
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
24.01.2012, 22:18     Файл. Потоки #8
Цитата Сообщение от vaselo Посмотреть сообщение
while(fs.eof())
Вдумайтесь...
vaselo
19 / 19 / 1
Регистрация: 17.10.2010
Сообщений: 247
24.01.2012, 22:46  [ТС]     Файл. Потоки #9
руководствуясь http://www.cplusplus.com/reference/iostream/fstream/
написал это:
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
// file.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <fstream>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    fstream fs;
    fs.open("file.txt");
            if(fs.is_open())//Если удачно открыли
            {
                int biggest;
                fs>>biggest;
                float c;
                cout<<"File opened succesfully\n";
                while(fs.good())
                {
                     fs>>c;
                    
                     if(c>biggest)
                     {
                             biggest=c;
                             fs.seekp(fs.tellg());//устанавливаю место начала ввода по месту считывания
                     }
                }
                fs<<"---";  ввожу, но файл не редактируется
 
            }
else
    {
        cout<<"Error. File can not be opened\n";
        system("pause");
        return 0;
    }
system("pause");
}
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
24.01.2012, 23:14     Файл. Потоки #10
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
#include <fstream>
#include <limits>
#include <iostream>
 
int main ()
{
    std::fstream fs("text.txt", std::fstream::in | std::fstream::out);
    int a;
    int max = std::numeric_limits<int>::min();
    long f, l;
    long cur = fs.tellp();
    while(fs >> a)
    {
        if(a > max)
        {
            max = a;
            f = cur + 1;
            l = fs.tellp();
        }
        cur = fs.tellp();
    }
    fs.clear();
    fs.seekp(f);
    //int i = 0;
    //std::cout << fs.tellp() << std::endl;
    while(fs.tellp() != l)
    {
        fs.write(" ", 1);
        //std::cout << fs.tellp() << std::endl;
        fs.seekp(++f);
    }
    //std::cout << f << ' ' << l << std::endl;
    fs.close();
    return 0;
}
Я в это не сильно углублялся, возможно, есть более изящный способ, кроме как в цикле затирать.
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
24.01.2012, 23:17     Файл. Потоки #11
мож пригодится кому. файловый поток ввода вывода с возможностью записывать и читать символы из позиции по индексу []

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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <iostream>
#include <fstream>
 
using namespace std;
 
class bf : public basic_filebuf<char>
{
 
    
public:
    bf()
    {};
    ~bf(){};
 
 
};
 
 
 
class m_stream : public basic_fstream<char>
{
    struct des
    {
        des(){};
        des(bf* B):b(B){}
        bf* b;
        char Temp;
        pos_type POZ;
        void init(bf* B)
        {
            b = B;
        }
 
        operator char()
        {
            b->pubseekpos(POZ);
            Temp = b->sgetc();
            b->sungetc();
            b->pubseekpos(0);
            return Temp;
        }
        void operator = (char c)
        {
            b->pubseekpos(POZ);
            b->sputc(c);
            b->pubseekpos(0);
 
        }
 
    };
 
    
 
 
    bf BUF;
    des DS;
public:
    m_stream():DS(&BUF)/*:basic_fstream<char>(&BUF)*/{init(&BUF);set_rdbuf(&BUF);};
    ~m_stream(){};
    
 
    des& operator [](pos_type p)
    {
 
        DS.POZ = p;
 
        return DS;
    }
 
    void open(const char* fname)
    {
 
        BUF.open(fname,ios::in|ios::out);
    }
 
 
    _Myfb *rdbuf() const
        {   // return pointer to file buffer
 
        return ((_Myfb *)&BUF);
        }
    
 
};
 
 
int main (int args, char* ar[])
{
 
 
 
m_stream m;
 
 
m.open("c:\\temp\\1.txt");
 
m[3] = '9';
m[20] = '6';
 
cout<<m.rdbuf();
 
 
return 0;
}
Миниатюры
Файл. Потоки  
vaselo
19 / 19 / 1
Регистрация: 17.10.2010
Сообщений: 247
25.01.2012, 00:24  [ТС]     Файл. Потоки #12
вот уже пол часа бился над прогой: вдруг перестало читать из файла числа! уже пересоздавал, перегружался - ничего. екзешник работает четко, а если из-под visual studio 2010 не работает - читает число, но переменная остается неинициализированой. проверьте, отпишитесь
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
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <fstream>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    fstream fs;
    fs.open("file.txt");
    long pos;
    int i=0;
            if(fs.is_open())//Если удачно открыли
            {
                int biggest;
                fs>>biggest;                        //первое число - наибольшее
                int c;
                cout<<"File opened succesfully\n";
                while(fs.good())                    //пока файл не закончился
                {
                     fs>>c;                         //берем число
                     if(c>biggest)
                     {
                             biggest=c;             //если оно больше Наибольшего - заменяем
                             pos=fs.tellg();        //запоминаем позицию
                    }   
                }
                while(biggest)                      //находим длинну числа
                {
                    biggest/=10;
                    i++;
                }
                fs.clear();
                fs.seekg(pos-i);                    //устанавливаем позицию записи
                while(i)
                {
                    fs.write("n",1);                //пишем пробелы
                    i--;
                }
                
            }
else
    {
        cout<<"Error. File can not be opened\n";
        system("pause");
        return 0;
    }
system("pause");
}
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
25.01.2012, 00:32     Файл. Потоки #13
Цитата Сообщение от vaselo Посмотреть сообщение
но переменная остается неинициализированой.
Какая? На первый взгляд все в порядке.

Что вам мешает запоминать 2 переменные? Не нужен будет цикл для вычисления длинны максимального числа.
vaselo
19 / 19 / 1
Регистрация: 17.10.2010
Сообщений: 247
25.01.2012, 00:34  [ТС]     Файл. Потоки #14
Цитата Сообщение от soon Посмотреть сообщение
Какая? На первый взгляд все в порядке.

Что вам мешает запоминать 2 переменные? Не нужен будет цикл для вычисления длинны максимального числа.
любое чтение в переменную из файла не приводит ни к чему. но если запускать сам экзешник - все впорядке.
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
25.01.2012, 00:39     Файл. Потоки #15
Попробуйте другой файл открыть. У меня все работает.

Добавлено через 3 минуты
vaselo, может быть вы запускали программу, ну она вам и потерла все числа в файле, соответствено считать больше ничего не может.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2012, 00:41     Файл. Потоки
Еще ссылки по теме:

потоки - C++
Здравствуйте. Есть форма, на которой есть два объекта Button. При нажатии на каждый выполняется умножение 2 функции и в 2 объекта Label...

Потоки - C++
Здравствуйте. Изначально код моей программы выглядел примерно так void Thread( void* pParams ) { //Код } void Thread1(...

потоки - C++
Задали мне задачку решить которую я не смог. Задача такая: написать код (на с++), который продемонстрирует различие действия endl и \n,...

Потоки - C++
Кто может скинуть какую-нибуть хорошую статью по ПОТОКАМ? читал про них в книге Шилдт &quot;С++ Базовый курс&quot;, но мало что понял((


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

Или воспользуйтесь поиском по форуму:
vaselo
19 / 19 / 1
Регистрация: 17.10.2010
Сообщений: 247
25.01.2012, 00:41  [ТС]     Файл. Потоки #16
Цитата Сообщение от soon Посмотреть сообщение
Попробуйте другой файл открыть. У меня все работает.

Добавлено через 3 минуты
vaselo, может быть вы запускали программу, ну она вам и потерла все числа в файле, соответствено считать больше ничего не может.
нет, файл я сам редактирую. с этим все впорядке. как бы нибыло, прога понравилась, мы это сделали, всем спасибо за содействие. Конечный результат:
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
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <fstream>
using namespace std;
 
int tmain()
{
    fstream fs;
    fs.open("file.txt");
    long pos;
    int i=0;
            if(fs.is_open())//Если удачно открыли
            {
                int biggest;
                fs>>biggest;                        //первое число - наибольшее
                int c;
                cout<<"File opened succesfully\n";
                while(fs.good())                    //пока файл не закончился
                {
                     fs>>c;                         //берем число
                     if(c>biggest)
                     {
                             biggest=c;             //если оно больше Наибольшего - заменяем
                             pos=fs.tellg();        //запоминаем позицию
                    }   
                }
                while(biggest)                      //находим длинну числа
                {
                    biggest/=10;
                    i++;
                }
                fs.clear();
                fs.seekg(pos-i);                    //устанавливаем позицию записи
                while(i)
                {
                    fs.write(" ",1);                //пишем пробелы
                    i--;
                }
                
            }
else
    {
        cout<<"Error. File can not be opened\n";
        system("pause");
        return 0;
    }
system("pause");
}
Yandex
Объявления
25.01.2012, 00:41     Файл. Потоки
Ответ Создать тему
Опции темы

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