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

работа с потоком - C++

Восстановить пароль Регистрация
 
Valerko
17 / 17 / 1
Регистрация: 30.11.2010
Сообщений: 164
30.03.2011, 01:06     работа с потоком #1
есть текстовый файл с примерно таким сожержанием:

1 5 test 2 9 111
22 12 99 proverka 10 1
1 23 10 schet 50
12 44 34 74 29

и т.д.
Количество символов и количество строк не больше 80.

Нужно считать все что есть в файле, вывести исходные данные, а затем только строки, которые содержат двузначные числа (т.е из примера выше 1 строка вывестись не должна)


Я не знаю как сделать так чтобы оно считывало символы и числа и выводила их нормально, поэтому застрял в самом начале
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2011, 01:06     работа с потоком
Посмотрите здесь:

работа с файловым потоком!!! C++
C++ задача с файловым потоком
C++ Работа с файловым потоком
Потоком из файла в структуру C++
Посещение потоком определенной функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IrineK
Заблокирован
30.03.2011, 01:37     работа с потоком #2
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
#include <iostream>
#include <sstream>
#include <fstream>
using namespace std;
 
bool filter (char buf[])
{   string str(buf);
    string word;
    istringstream iSTR(str);
    while(iSTR>>word)
        if (!(word.length()==2 && '0'<=word[0]&& word[0]<='9'&& '0'<=word[1]&& word[1]<='9'))
            return false;
    return true;
}
 
int main()
{   char buffer[80];
    ifstream iFSTR;
    iFSTR.open("initial.txt");
    if(iFSTR.bad())
    {   cout<<"Error opening file\n";
        cin.get();
        exit(1);
    }
 
    ofstream oFSTR;
    oFSTR.open("2Dnumber.txt");
    if(oFSTR.bad())
    {   cout<<"Error creating file\n";
        cin.get();
        exit(1);
    }
 
    cout<<"Initial file: \n";
    while (iFSTR.good())
    {   iFSTR.getline(buffer,80,'\n');
        cout<<buffer<<"\n";
        if(filter(buffer))
            oFSTR<<buffer<<"\n";
    }
    iFSTR.close();
    oFSTR.close();
    
    
    ifstream iRES;
    iRES.open("2Dnumber.txt");
    if(iRES.bad())
    {   cout<<"Error opening file\n";
        cin.get();
        exit(1);
    }
 
    cout<<"After filter: \n";
    while (iRES.good())
    {   iRES.getline(buffer,80,'\n');
        cout<<buffer<<"\n";
    }
    iRES.close();
    
    cin.sync(); cin.get();
    return 0;
}
Valerko
17 / 17 / 1
Регистрация: 30.11.2010
Сообщений: 164
30.03.2011, 01:49  [ТС]     работа с потоком #3
Цитата Сообщение от IrineK Посмотреть сообщение
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
#include <iostream>
#include <sstream>
#include <fstream>
using namespace std;
 
bool filter (char buf[])
{   string str(buf);
    string word;
    istringstream iSTR(str);
    while(iSTR>>word)
        if (!(word.length()==2 && '0'<=word[0]&& word[0]<='9'&& '0'<=word[1]&& word[1]<='9'))
            return false;
    return true;
}
 
int main()
{   char buffer[80];
    ifstream iFSTR;
    iFSTR.open("initial.txt");
    if(iFSTR.bad())
    {   cout<<"Error opening file\n";
        cin.get();
        exit(1);
    }
 
    ofstream oFSTR;
    oFSTR.open("2Dnumber.txt");
    if(oFSTR.bad())
    {   cout<<"Error creating file\n";
        cin.get();
        exit(1);
    }
 
    cout<<"Initial file: \n";
    while (iFSTR.good())
    {   iFSTR.getline(buffer,80,'\n');
        cout<<buffer<<"\n";
        if(filter(buffer))
            oFSTR<<buffer<<"\n";
    }
    iFSTR.close();
    oFSTR.close();
    
    
    ifstream iRES;
    iRES.open("2Dnumber.txt");
    if(iRES.bad())
    {   cout<<"Error opening file\n";
        cin.get();
        exit(1);
    }
 
    cout<<"After filter: \n";
    while (iRES.good())
    {   iRES.getline(buffer,80,'\n');
        cout<<buffer<<"\n";
    }
    iRES.close();
    
    cin.sync(); cin.get();
    return 0;
}
строки с буквами должны были тоже вывестись
IrineK
Заблокирован
30.03.2011, 01:53     работа с потоком #4
Заказывали:
1)вывести исходные данные
2)только строки, которые содержат двузначные числа
Выведено.
Valerko
17 / 17 / 1
Регистрация: 30.11.2010
Сообщений: 164
30.03.2011, 01:54  [ТС]     работа с потоком #5
Цитата Сообщение от IrineK Посмотреть сообщение
Заказывали:


Выведено.
строки с буквами тоже содержат двузн. числа)
IrineK
Заблокирован
30.03.2011, 01:58     работа с потоком #6
Прочитайте внимательно свои пожелания и укажите, в чем они противоречат реализации?
Нужно четче формулировать.
Доделывать будете сами. Золотая рыбка пошла спать.
Valerko
17 / 17 / 1
Регистрация: 30.11.2010
Сообщений: 164
30.03.2011, 02:22  [ТС]     работа с потоком #7
Цитата Сообщение от IrineK Посмотреть сообщение
Прочитайте внимательно свои пожелания и укажите, в чем они противоречат реализации?
Нужно четче формулировать.
Доделывать будете сами. Золотая рыбка пошла спать.
спокойной ночи)

Добавлено через 4 минуты
Цитата Сообщение от IrineK Посмотреть сообщение
C++
1
        if (!(word.length()==2 && '0'<=word[0]&& word[0]<='9'&& '0'<=word[1]&& word[1]<='9'))
это здесь получается надо изменять?

Добавлено через 18 минут
что-то не особо получается(
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,665
30.03.2011, 06:54     работа с потоком #8
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
/////////////////////////////////////////////////////////////////////////////////////////
//есть текстовый файл с примерно таким сожержанием:
//
//1 5 test 2 9 111
//22 12 99 proverka 10 1
//1 23 10 schet 50
//12 44 34 74 29
//
//и т.д.
//Количество символов и количество строк не больше 80.
//
//Нужно считать все что есть в файле, вывести исходные данные, а затем только строки, 
//которые содержат двузначные числа (т.е из примера выше 1 строка вывестись не должна)
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cctype>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string         T_str;
typedef std::vector<T_str>  T_strings;
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    const T_str  FILENAME = "f.txt";
    std::ofstream  ofile(FILENAME.c_str());
    ofile << "1 5 test 2 9 111"
          << std::endl 
          << "22 12 99 proverka 10 1"
          << std::endl 
          << "1 23 10 schet 50"
          << std::endl 
          << "12 44 34 74 29"
          << std::endl;
 
    std::ifstream  ifile(FILENAME.c_str());  
    
    T_strings  lines;
    T_str      line;
    while(getline(ifile, line))
    {
        lines.push_back(line);
    }
 
    std::cout << "Содержимое файла \""
              << FILENAME
              << "\":"
              << std::endl;
    std::copy(lines.begin(), lines.end(), 
              std::ostream_iterator<T_str>(std::cout, "\n"));
    std::cout << std::endl;
 
    struct  T_line_not_contains_two_digit_number
    {
        bool  operator() (const T_str&  s)
        {
            std::istringstream  ssin(s);        
            T_str  word;            
            while(ssin >> word)
            {
                bool  is_two_digit_number =    word.size() == 2
                                            && isdigit(word[0])
                                            && isdigit(word[1]);
 
                if(is_two_digit_number) return  false;
            }
            return  true;
        }
    };
 
    std::cout << "Строки файла \""
              << FILENAME 
              << "\", содержащие двузначные числа:"
              << std::endl;
    std::remove_copy_if(lines.begin(), lines.end(), 
                        std::ostream_iterator<T_str>(std::cout, "\n"),
                        T_line_not_contains_two_digit_number());
    std::cout << std::endl;
}
IrineK
Заблокирован
30.03.2011, 09:37     работа с потоком #9
Чтобы выводились строки, в которых есть хотя бы одно двузначное число:

C++
1
2
3
4
5
6
7
8
9
bool filter (char buf[])
{   string str(buf);
    string word;
    istringstream iSTR(str);
    while(iSTR>>word)
        if (word.length()==2 && '0'<=word[0]&& word[0]<='9'&& '0'<=word[1]&& word[1]<='9')
            return true;
    return false;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2011, 11:46     работа с потоком
Еще ссылки по теме:

C++ Переворот рисунка потоком
C++ Работа с потоком изменить кодировку
Работа с потоком (управление, защита) C++

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

Или воспользуйтесь поиском по форуму:
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
30.03.2011, 11:46     работа с потоком #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
36
37
38
39
40
41
42
#include <stdio.h>
#include <math.h>
 
 
void main() {
 
FILE*  fp = fopen("X:\\test.txt", "r");
 
fseek(fp, 0, SEEK_END);
long size = ftell(fp);
fseek(fp, 0, SEEK_SET);
 
char* buff = new char[ size ];
memset(buff, '\0', size);
fread((void*) buff, size, 1, fp);
fclose(fp);
 
puts(buff);   // выведим исходную строку
puts("\n");
 
char  fill[12];
memset(fill, '\0', sizeof(fill));
char*  iter          = fill;
const char*  str = buff; 
do {
    
      if( *str >= '0' && *str <= '9' ) {
    *iter = *str;
    ++iter;
       } else {
    if(floor(log10(atol(fill))) == 1)  // только двухзначные числа
          printf("%d, ", atol(fill) );  
             memset(fill, '\0', sizeof(fill));
    iter = fill;
        }
 
} while( *str++ != '\0' );
 
delete[] buff;
buff = NULL;
 
}
Yandex
Объявления
30.03.2011, 11:46     работа с потоком
Ответ Создать тему
Опции темы

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