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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
#1

Работа с текстовыми файлами - C++

03.12.2011, 21:16. Просмотров 2167. Ответов 23
Метки нет (Все метки)

Во входной файл подается текст вида: aaabcbbffff
В исходной файле получается: 3аbc2b4f
простейшая компоновка получается.
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
#include "stdafx.h"
#include <fstream>
 
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    fstream in("text.txt", ios::in);
    fstream out("result.txt",ios::out);
    char ch;
    char y;
    int i=0,k=0;
    in>>ch,y=ch;
    while(in)
    {   
        in>>ch;
        if(y==ch)
            k++;
        else
            {
                if(!k)
                    out<<y,k=0;
                else
                    out<<k+1<<y,k=0;
            }
        y=ch;
        
    }
    out<<k<<y;
    return 0;
}
у меня вопрос, почему если в файле в конце стоят пять пробелов, программа не видит их?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2011, 21:16
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Работа с текстовыми файлами (C++):

Работа с текстовыми файлами - C++
Здравствуйте! Как подсчитать количество букв, которые встретились в тексте двойными? Помогите пожалуйста Добавлено через 23 минуты ...

Работа с текстовыми файлами - C++
Разработать программу, которая: а) создает текстовый файл TF5_1 с символьных строк различной длины; б) читает содержимое файла TF5_1,...

Работа с текстовыми файлами в С++ - C++
Здравствуйте. На лето задали написать прогу в среде visual studio c++, но этот предмет у меня закончился зимой и я конечно уже забыл...

Работа с текстовыми файлами. - C++
Здравствуйте)) Не могли бы Вы мне помочь с такой задачей:создать текстовый файл. Найти номер самой длинной строки. Создавать файлы я...

Работа с текстовыми файлами - C++
3)Разработать программу, которая выполняет следующие действия: создает входной поток для построчного чтения из внешнего файла и выходной...

Работа с текстовыми файлами - C++
Задача: написать программу, которая считывает слова из текстового файла. Слова разделены символом &quot;;&quot;. Нужно записать эти слова в новый...

23
Kidasov
77 / 77 / 12
Регистрация: 02.12.2011
Сообщений: 965
Записей в блоге: 3
03.12.2011, 21:32 #2
При использовании оператора ">>" для считывания данных их текстовых файлов происходит преобразование некоторых символов, например, пробельные символы пропускаются. Кроме того при использовании оператора ">>" для считывания строки ввод прекращается при обнаружении первого пробельного символа
1
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
03.12.2011, 21:46  [ТС] #3
спасибо) cin.get() все исправил)
0
-=ЮрА=-
Заблокирован
Автор FAQ
03.12.2011, 22:02 #4
Предлагаю получать символы из fstream посредством fstream::get
Вот код который парсит и пробелы вконце
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
#include <iostream>
#include <fstream>
using namespace std;
 
int main()
{
    long nCount;
    char ch, buf;
    ifstream ifs("text.txt");
    ofstream ofs("result.txt");
    ifs.get(ch);
    while(!ifs.eof())
    {
        nCount = 1;
        while(!ifs.eof())
        {
            ifs.get(buf);
            if(buf == ch && buf)
                nCount++;
            else
                break;
        }
        if(1 < nCount)
        {
            cout<<nCount;
            ofs<<nCount;
        }
        ofs<<ch;
        cout<<ch;
        ch = buf;
    }
    ifs.close();
    ofs.close();
    cout<<"<-END TEXT\n";
    system("pause");
    return 0;
}
text.txt
aaabcbbffff <-стрелка чтобы было видно пробелы
Вовод в reslt.txt аналогичен выводу на экран (см скрин)
1
Миниатюры
Работа с текстовыми файлами  
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
05.12.2011, 20:47  [ТС] #5
а если файл пустой, то что делать? он просто в выходной файл выводит "М"
что это значит?
0
-=ЮрА=-
Заблокирован
Автор FAQ
05.12.2011, 21:14 #6
Цитата Сообщение от xexew Посмотреть сообщение
а если файл пустой, то что делать? он просто в выходной файл выводит "М"
что это значит?
- т.к. файл пустой в нём содержится единственный символ EOF вот его то ifs.get(ch); впихивает в ch(это было первым подозрением), НО с EOF в этот цикл
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
while(!ifs.eof())
не зайдём. Поэтому М обусловлена тем, что просто открыли ofs
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ofstream ofs("result.txt");
я предлагаю ofs инициализировать только если исходный файл не пустой, сейчас подправлю

Добавлено через 4 минуты
xexew, вот так думаю будет защита от пустого файла с исходными данными
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 <fstream>
using namespace std;
 
int main()
{
    long nCount;
    char ch, buf;
    ifstream ifs("text.txt");
    ofstream ofs;
    if(!ifs)
        cout<<"error open text.txt\n";
    else
    {
        ifs.get(ch);
        if(!ifs.eof())
            ofs.open("result.txt");
    }
    if(ifs != NULL && ofs != NULL)
    {
        while(!ifs.eof())
        {
                nCount = 1;
                while(!ifs.eof())
                {
                        ifs.get(buf);
                        if(buf == ch && buf)
                                nCount++;
                        else
                                break;
                }
                if(1 < nCount)
                {
                        cout<<nCount;
                        ofs<<nCount;
                }
                ofs<<ch;
                cout<<ch;
                ch = buf;
        }
        ifs.close();
        ofs.close();
        cout<<"<-END TEXT\n";
    }
    system("pause");
    return 0;
}
Жду результатов теста
0
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
05.12.2011, 21:35  [ТС] #7
ввожу: aaabcbbffff
выводит: 3abc2b5f
после изменения файла text.txt и проработки программы, она не создает новый файл result.txt, то есть если до этого я написал во входном файле любой набор символов, в выходной файл выведутся эти символы, но после того как я изменю файл текста(пустой допустим), и запущу опять программу, но результат будет от предыдущей задачи
в моей программе идет самостоятельное создание файла результатов, если оного нет. и замена старого файла результатов
0
-=ЮрА=-
Заблокирован
Автор FAQ
05.12.2011, 21:47 #8
xexew, надо подумать...
0
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
05.12.2011, 21:53  [ТС] #9
вот мой вариант, не работает только тогда, когда у меня файл пустой, во всех остальных случаях нормально работает(по крайней мере я не смог найти ошибку). можно простым условием это решить, но как это сделать без доп условия?

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 "stdafx.h"
#include <fstream>
 
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    fstream in("text.txt", ios::in);
    fstream out("result.txt",ios::out);
    char ch;
    char y;
    int i=0,k=0;
    
        in.get(ch);y=ch;
    while(!in.eof())
    {   
        in.get(ch);
        if(y==ch)
            k++;
        else
            {
                if(!k)
                    out<<y,k=0;
                    
                else
                    out<<k+1<<y,k=0;
            }
        y=ch;
        
    }
    
    if(k==0 || k==1)
    out<<ch;
    else
        out<<k<<ch;
    
    return 0;
}
Добавлено через 3 минуты
если делать debug vs studio, то в 15 строке, когда файл пустой, присваивается некое значение М
0
-=ЮрА=-
Заблокирован
Автор FAQ
05.12.2011, 22:20 #10
Цитата Сообщение от xexew Посмотреть сообщение
если делать debug vs studio, то в 15 строке, когда файл пустой, присваивается некое значение М
- ёпт єто же не мой код!
Понятное дело что тут ch будет писать даже если и не считаели её
Цитата Сообщение от xexew Посмотреть сообщение
in.get(ch);y=ch;
Вы считали кнец EOF y = EOF а потом не заходя в цикл здесь
Цитата Сообщение от xexew Посмотреть сообщение
if(k==0 || k==1)
* * * * out<<ch;
* * * * else
* * * * * * * * out<<k<<ch;
пишите out<<EOF;

xexew, зачем было коверкать мой код???А я голову ломаю!!!

Добавлено через 1 минуту
xexew, внёс казалось бы какие то маааханькие изменения - а они перечеркнули мой алгоритм к чертям, зачем было менять мой алгоритм из 4-го поста???

Добавлено через 1 минуту

Цитата Сообщение от xexew Посмотреть сообщение
if(y==ch)
* * * * * * * * * * * * k++;
* * * * * * * * else
* * * * * * * * * * * * {
* * * * * * * * * * * * * * * * if(!k)
* * * * * * * * * * * * * * * * * * * * out<<y,k=0;
else
* * * * * * * * * * * * * * * * * * * * out<<k+1<<y,k=0;
* * * * * * * * * * * * }
* * * * * * * * y=ch;
- Это х*ень!Нужен цикл как у меня, нравиться это или нет
0
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
05.12.2011, 22:29  [ТС] #11
тест я делал по вашим прогам, задавал я вопросы обобщенные.
ввожу: aaabcbbffff
выводит: 3abc2b5f
вот это у вашей программы выдает, а не у моей

Добавлено через 1 минуту
и не перезаписывает то же у вас, поэтому мне было удобней своим алгоритмом пользоваться
0
-=ЮрА=-
Заблокирован
Автор FAQ
05.12.2011, 23:03 #12
Цитата Сообщение от xexew Посмотреть сообщение
не перезаписывает то же у вас, поэтому мне было удобней своим алгоритмом пользоваться
- некорректно отрабатывало лишь на последней последовательности, это грабли с концом файла(объяснять долго, так что опущу). Теперь всё чётко работает и с пустым text.txt тоже!
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 <iostream>
#include <fstream>
using namespace std;
 
int main()
{
    long nCount;
    char ch, buf;
    ifstream ifs("text.txt");
    ofstream ofs("result.txt");
    ifs.get(ch);
    while(!ifs.eof())
    {
        nCount = 1;
        while(!ifs.eof())
        {
            ifs.get(buf);
            if(buf == ch)
                nCount++;
            else
                break;
        }
        if(ifs.eof())
            nCount--;
        if(0 < nCount)
        {
            cout<<nCount;
            ofs<<nCount;
        }
        ofs<<ch;
        cout<<ch;
        ch = buf;
    }
    ifs.close();
    ofs.close();
    cout<<"<-END TEXT\n";
    system("pause");
    return 0;
}
Добавлено через 20 секунд
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(ifs.eof())
* * * * * * * * * * * * nCount--;
- вот и вся модернизация
1
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
05.12.2011, 23:08  [ТС] #13
спасибо)
0
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
08.12.2011, 21:40  [ТС] #14
может кто подсказать алгоритм решения такой задачи: есть входной файл с текстом, в каждой строке поменять местами первое и последнее слово и переписать такую строку в исходный файл.
я вот думаю считывать сразу всю строку в массив, находить первое слово, затем последнее, поменять их местами и вывести в исходный файл, и так с каждой строкой. может есть более разумный и эффективный способ реализовать эту программу?
0
-=ЮрА=-
Заблокирован
Автор FAQ
08.12.2011, 22:55 #15
xexew, С/С++???
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.12.2011, 22:55
Привет! Вот еще темы с ответами:

Работа с текстовыми файлами - C++
Прошу помощи! Необходимо что б программа считывала данные из обычного текстового файла и записывала в нужные переменные. Текстовый файл...

Работа с текстовыми файлами - C++
Функция копирует с одного файла в другой, не подскажите как улучшить ее? И есть недостаток нужно подсчитывать количество элементов в файле...

Работа с текстовыми файлами - C++
Делаю лабы по С++. Необходимо записать несколько строк в файл, а затем считать их оттуда. Использую методы, описанные в методичке (по сути,...

Работа с текстовыми файлами - C++
Помоготи , пожалуйста : Создать текстовый файл и выполнить обработку текста в файле ... Пример : 2) Создать текстовый файл,...


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

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

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