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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
03.12.2011, 21:16     Работа с текстовыми файлами #1
Во входной файл подается текст вида: 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;
}
у меня вопрос, почему если в файле в конце стоят пять пробелов, программа не видит их?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2011, 21:16     Работа с текстовыми файлами
Посмотрите здесь:

C++ Работа с текстовыми файлами
работа с текстовыми файлами C++
Работа с текстовыми файлами в С++ C++
Работа с текстовыми файлами C++
C++ Работа с текстовыми файлами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kidasov
76 / 76 / 12
Регистрация: 02.12.2011
Сообщений: 966
Записей в блоге: 3
03.12.2011, 21:32     Работа с текстовыми файлами #2
При использовании оператора ">>" для считывания данных их текстовых файлов происходит преобразование некоторых символов, например, пробельные символы пропускаются. Кроме того при использовании оператора ">>" для считывания строки ввод прекращается при обнаружении первого пробельного символа
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
03.12.2011, 21:46  [ТС]     Работа с текстовыми файлами #3
спасибо) cin.get() все исправил)
-=ЮрА=-
Заблокирован
Автор 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 аналогичен выводу на экран (см скрин)
Миниатюры
Работа с текстовыми файлами  
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
05.12.2011, 20:47  [ТС]     Работа с текстовыми файлами #5
а если файл пустой, то что делать? он просто в выходной файл выводит "М"
что это значит?
-=ЮрА=-
Заблокирован
Автор 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;
}
Жду результатов теста
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
05.12.2011, 21:35  [ТС]     Работа с текстовыми файлами #7
ввожу: aaabcbbffff
выводит: 3abc2b5f
после изменения файла text.txt и проработки программы, она не создает новый файл result.txt, то есть если до этого я написал во входном файле любой набор символов, в выходной файл выведутся эти символы, но после того как я изменю файл текста(пустой допустим), и запущу опять программу, но результат будет от предыдущей задачи
в моей программе идет самостоятельное создание файла результатов, если оного нет. и замена старого файла результатов
-=ЮрА=-
Заблокирован
Автор FAQ
05.12.2011, 21:47     Работа с текстовыми файлами #8
xexew, надо подумать...
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 строке, когда файл пустой, присваивается некое значение М
-=ЮрА=-
Заблокирован
Автор 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;
- Это х*ень!Нужен цикл как у меня, нравиться это или нет
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
05.12.2011, 22:29  [ТС]     Работа с текстовыми файлами #11
тест я делал по вашим прогам, задавал я вопросы обобщенные.
ввожу: aaabcbbffff
выводит: 3abc2b5f
вот это у вашей программы выдает, а не у моей

Добавлено через 1 минуту
и не перезаписывает то же у вас, поэтому мне было удобней своим алгоритмом пользоваться
-=ЮрА=-
Заблокирован
Автор 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--;
- вот и вся модернизация
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
05.12.2011, 23:08  [ТС]     Работа с текстовыми файлами #13
спасибо)
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
08.12.2011, 21:40  [ТС]     Работа с текстовыми файлами #14
может кто подсказать алгоритм решения такой задачи: есть входной файл с текстом, в каждой строке поменять местами первое и последнее слово и переписать такую строку в исходный файл.
я вот думаю считывать сразу всю строку в массив, находить первое слово, затем последнее, поменять их местами и вывести в исходный файл, и так с каждой строкой. может есть более разумный и эффективный способ реализовать эту программу?
-=ЮрА=-
Заблокирован
Автор FAQ
08.12.2011, 22:55     Работа с текстовыми файлами #15
xexew, С/С++???
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
08.12.2011, 23:18  [ТС]     Работа с текстовыми файлами #16
-=ЮрА=-, с++
-=ЮрА=-
Заблокирован
Автор FAQ
08.12.2011, 23:20     Работа с текстовыми файлами #17
Цитата Сообщение от xexew Посмотреть сообщение
-=ЮрА=-, с++
- ок, я в работе...
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
13.12.2011, 00:10  [ТС]     Работа с текстовыми файлами #18
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
#include "iostream"
#include "fstream"
#define n 40
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
ifstream ifile("text.txt");
ofstream ofile("result.txt");
char str[n];
int i=0,j,k,m,p,s;
while(ifile)
{
    ifile.getline(str,n+1);
    int str_size=strlen(str);
    if(str_size!=0)
    {
        for(;str[i]==' ';i++)//пробелы в начале
            ofile.put(' ');
        
        for(j=i;str[j]!=' ';j++);
            p=j;//конец первого слова
 
        for(k=str_size-1;str[k]==' ';k--);//пробелы в конце
            for(m=k;str[m]!=' ';m--);
            m++;
        s=m;//начало последнего слова
    
        
        if(i==m)
            for(;i<=str_size;i++)
                ofile.put(str[i]);
        else
        {
            for(;m<=k;m++)
                ofile.put(str[m]);
            for(;j<s;j++)
                ofile.put(str[j]);
            for(;i<=p;i++)
                ofile.put(str[i]);
            for(k+=1;k<str_size-1;k++)
                ofile.put(str[k]);
            
            ofile.put('\n');
            i=0;
        }
    }
}
 
return 0;
}
программа работает, но с одним но, когда в текстовом файле есть строка из пробелов, она некорректно выводит строку.
эта ошибка в этой части кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if(i==m)
            for(;i<=str_size;i++)
                ofile.put(str[i]);
        else
        {
            for(;m<=k;m++)
                ofile.put(str[m]);
            for(;j<s;j++)
                ofile.put(str[j]);
            for(;i<=p;i++)
                ofile.put(str[i]);
            for(k+=1;k<str_size-1;k++)
                ofile.put(str[k]);
            
            ofile.put('\n');
            i=0;
я не знаю как решить эту ошибку, может может кто подсказать
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
15.12.2011, 23:29  [ТС]     Работа с текстовыми файлами #19
на правах апа, может кто глянет
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2011, 02:40     Работа с текстовыми файлами
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
16.12.2011, 02:40     Работа с текстовыми файлами #20
Цитата Сообщение от 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
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
using namespace std;
 
int main()
{
    long nWords;
    stringstream ss;
    string line, first, last, mid, buf;
    ifstream ifs("text.txt");
    ofstream ofs("result.txt");
    while(getline(ifs,line))
    {
        mid.empty();
        nWords = 1;
        ss.str(line);
        ss>>first;
        while(ss>>buf)
            nWords++;
        ss.clear();
        ss.str(line);
        while(ss>>buf)
        if(1 == (nWords--))
            last = buf;
        else
            mid += buf + " ";
        ss.clear();
        line.empty();
        line = last + " " + mid + " " + first;
        ofs<<line<<endl;
    }
    ifs.close();
    ofs.close();
    cout<<"Swaping complete\n";
    system("pause");
    return 0;
}
Миниатюры
Работа с текстовыми файлами  
Вложения
Тип файла: txt text.txt (519 байт, 7 просмотров)
Yandex
Объявления
16.12.2011, 02:40     Работа с текстовыми файлами
Ответ Создать тему
Опции темы

Текущее время: 02:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru