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

работа с файлами - C++

Восстановить пароль Регистрация
 
s92p
11 / 11 / 0
Регистрация: 12.09.2011
Сообщений: 42
12.09.2011, 15:06     работа с файлами #1
мне бы надо на C........... помогите пожалуйста, а то чет не могу разобраться


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
#include <iostream>
#include <stdio.h>
#include <string>
#include <fstream>
#include <Windows.h>
 
int main()
{
        std::fstream myfile;
        std::string parse_string,word;
        std::string::size_type beg_idx = 0, end_idx = 0;
        const std::string delim_string (" ");
        int howManyStrings = 0;
        bool onlyTwo = true;
        myfile.open("file.txt",std::ifstream::in);
 
        while(!myfile.eof())
        {
                beg_idx = 0, end_idx = 0;
                getline(myfile,parse_string); //Ваш 2й пункт.
                howManyStrings++; //Ваш 1й пункт.
                /*Ваш 3й пункт написан очень убого. Приведите пример данных из файла. Я так понимаю это чтото подобное: 
                11 11 22 55 33 66 88 44 99
                111 222 5555 8888 77 99
                Если, и только если, я прав, то Вам поможет следующее:*/
                while(std::string::npos != (beg_idx = parse_string.find_first_not_of( delim_string, end_idx )))
                {
                        if ( std::string::npos == (end_idx = parse_string.find_first_of( delim_string, beg_idx )) )
                        {
                                word = parse_string.substr ( beg_idx );
                                if(word.size()!=2){onlyTwo = false;break;}
                        }
                        else
                        {
                                word = parse_string.substr ( beg_idx, end_idx - beg_idx );
                                if(word.size()!=2){onlyTwo = false;break;}
                        }
                }
                if (onlyTwo)
                        std::cout << parse_string << std::endl;
        }
        std::cout << "string number: " << howManyStrings << std::endl;
        system("pause");
        return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2011, 15:06     работа с файлами
Посмотрите здесь:

Работа с файлами C++
C++ Работа с файлами.
C++ Работа с файлами
C++ работа с файлами
[С++] Работа с файлами C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
12.09.2011, 15:08     работа с файлами #2
s92p, а чего сделать то надо?
s92p
11 / 11 / 0
Регистрация: 12.09.2011
Сообщений: 42
12.09.2011, 15:13  [ТС]     работа с файлами #3
а блин.... короче
считывает текст из файла и выводит на экран только строки, не
содержащие двузначных чисел.
-=ЮрА=-
Заблокирован
Автор FAQ
12.09.2011, 16:45     работа с файлами #4
Цитата Сообщение от s92p Посмотреть сообщение
а блин.... короче
считывает текст из файла и выводит на экран только строки, не
содержащие двузначных чисел.
Вот код, файл данных и скриншот работы (всё написано на Си)
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
#include <windows.h>//malloc, system("pause");
#include <string.h> //strrchr, strtok
#include <stdio.h>  //i/o
 
bool IsTwoDigitsSubStr(char * s);//Проверка строки s на содержание двухзначных чисел
 
int main()
{
    long sLen;
    char * str, *buf;
    FILE * f = fopen("data.txt","rb+");
    if(!f)
        printf("Error open data.txt\r\n");
    else
    {
        //Опеределяем длинну файла
        fseek(f,0,SEEK_END);//курсор в конец файла
        sLen = ftell(f);//длина = позиция курсора
        fseek(f,0,SEEK_SET);//курсор в начало файла
 
        //считываем сразу весь файл в буфер
        if(!(str = (char *)malloc((sLen + 1)*sizeof(char))))
            printf("Allocation memory error\r\n");
        else
        {
            fread(str,sLen,1,f);
            str[sLen] = '\0';//Убрали мусор вконце строки
 
            if(str)
            {
                //Работаем со строкой от её конца
                buf = strrchr(str,'\n');
                while(buf)
                {
                    //Если строка не содержит двузначных чисел - выводим её
                    if(!IsTwoDigitsSubStr(buf + 1))
                        printf("%s\r\n",buf + 1);
                    str[sLen - strlen(buf) - 1] = '\0';//Исключаем из строки buf
                    buf = strrchr(str,'\n');
                    sLen = strlen(str);
                }
                if(str)//Вконце останется 1-ая строка
                if(!IsTwoDigitsSubStr(str))
                    printf("%s\r\n",str);
            }
        }
        fclose(f);
    }
    system("pause");//Останов программы до нажатия любой клавиши
    return 0;
}
 
bool IsTwoDigitsSubStr(char * s)
{
    bool bRet = false;
    long sLen;
    char * str;
    char * buf;
    char delim[] = " ;";//Возможніе разделители токенов - пробел и ';'
    if(s)
    {
        //В программе используем strtok которая обнуляет строку 
        //поэтому для анализа копируем строку
        sLen = strlen(s);
        str = (char *)malloc((sLen + 1)*sizeof(char));
        sprintf(str," %s",s);
        str[sLen] = '\0';
        buf = strtok(str,delim);
        while(buf)
        {
            if(strlen(buf) == 2)//В подстроке два символа
            if(isdigit(buf[0]) && isdigit(buf[1]))
                bRet = true;//Если оба символы строки цифры то значит buf - двузначное число
//          if(bRet)
//              break;//Если стркоа содержит хоть 1-но двузначное число прекращаем её разбор
            buf = strtok(NULL,delim);
        }
        //Чистить память после strtok не нужно str == NULL
    }
    return bRet;
}
Миниатюры
работа с файлами  
Вложения
Тип файла: txt data.txt (129 байт, 21 просмотров)
s92p
11 / 11 / 0
Регистрация: 12.09.2011
Сообщений: 42
12.09.2011, 21:50  [ТС]     работа с файлами #5
может еще с этим поможешь
???????????

Написать программу, которая преобразует введенное с клавиатуры восьмиразрядное
двоичное число в десятичное
-=ЮрА=-
Заблокирован
Автор FAQ
13.09.2011, 09:14     работа с файлами #6
Цитата Сообщение от s92p Посмотреть сообщение
Написать программу, которая преобразует введенное с клавиатуры восьмиразрядное
двоичное число в десятичное
- хорошо уже занимаюсь
mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
13.09.2011, 09:36     работа с файлами #7
Цитата Сообщение от s92p Посмотреть сообщение
Написать программу, которая преобразует введенное с клавиатуры восьмиразрядное
двоичное число в десятичное
Как вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream.h>
#include <math.h>
 
int main()
{
 cout << "2: ";
 char dv[8];
 cin >> dv;
 int des=0;
 for (int k=0;k<8;k++)
  des+=(dv[k]-48)*pow(2,k+1);
 cout << des;
 system("pause");
 return 0;
}
-=ЮрА=-
Заблокирован
Автор FAQ
13.09.2011, 09:38     работа с файлами #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
#include <string.h>//strlen
#include <stdio.h> //i/o
#include <ctype.h> //toupper
#include <conio.h> //getch
#include <math.h>  //pow
 
int BinToDec(char * bin);
 
int main()
{
    char bin[9];
    do
    {
        printf("Enter binary string (max 8-digits)\r\n");
        scanf("%s",bin);
        printf("Decimial num : %d\r\n", BinToDec((char *)&bin[0]));
        printf("Y - new input\r\n");
    }
    while(toupper(getch()) == 'Y');
    return 0;
}
 
int BinToDec(char * bin)
{
    int num = 1;
    int sLen;
    if(bin != NULL)
    {
        sLen = strlen(bin);
        for(int i = 0; i < sLen; i++)
        if(bin[i] == '1')
           num += pow(2,sLen - i - 1);
    }
    return num;
}
Миниатюры
работа с файлами  
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
13.09.2011, 09:39     работа с файлами #9
mimicria, забыли место для символа '\0' забронировать в массиве dv Понимаю, в вашем алгоритме это не нужно, но не то как-то выглядит.
-=ЮрА=-
Заблокирован
Автор FAQ
13.09.2011, 09:40     работа с файлами #10
Цитата Сообщение от mimicria Посмотреть сообщение
for (int k=0;k<8;k++)
- а если я захочу ввести 10100 - программа тоже до 8-ми считать будет???
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
13.09.2011, 09:51     работа с файлами #11
Очень смущает функция pow(). Я бы экономнее сделал:

C++
1
2
3
4
5
6
7
char s[N];
int i, x, len;
...
len = strlen(s);
for(x = i = 0; i < len; i++)
   x = x*2 + s[i] - '0';
std::cout << x;
mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
13.09.2011, 09:57     работа с файлами #12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
а если я захочу
В задаче ясно сказано
введенное с клавиатуры восьмиразрядное двоичное число
Я не старался сделать больше необходимого
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
13.09.2011, 10:29     работа с файлами #13
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Как вариант еще такой метод (ввод данных не делал, так как я демонстрирую способ перевода числа, а не способ ввода с клавиатуры; и проверку строки на корректность данных тоже не делал именно поэтому ) :
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <string.h>
 
int binary_string_to_int(const char *ptr) {
   int offset = strlen(ptr), result = 0;
   while (offset)
      result |= (*ptr++ - '0') << --offset;
      
   return result;
}
 
int main() {
   printf("%d\n", binary_string_to_int("001111"));
   return 0;
}
s92p
11 / 11 / 0
Регистрация: 12.09.2011
Сообщений: 42
13.09.2011, 16:37  [ТС]     работа с файлами #14
Цитата Сообщение от s92p Посмотреть сообщение

Написать программу, которая преобразует введенное с клавиатуры восьмиразрядное
двоичное число в десятичное


я немного по другому написал
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "stdio.h"
 
int main()
{
 
    char    keyb_array[10];         // keyboard input buffer
    int             result = 0;
    int counter = 0;
 
    gets(keyb_array);
 
    for (counter = 0; counter < 8; counter++ )
    {
        result = result<<1;
        result += (int)( keyb_array[ counter ] - 0x30 );
 
    }
 
    printf("%i", result);
    return result;
 
}
Добавлено через 5 минут
ограничение же стоит (k<8)



у меня еще задачка есть вот

Удалить из текста, находящегося в файле, каждое четное предложение.
то же на C


у меня проблема на счет записи в буфер и чтение из него
-=ЮрА=-
Заблокирован
Автор FAQ
13.09.2011, 16:56     работа с файлами #15
Цитата Сообщение от s92p Посмотреть сообщение
Удалить из текста, находящегося в файле, каждое четное предложение.
то же на C
- сейчас займусь - только вопрос предложения в новый файл записать или только вывести???
s92p
11 / 11 / 0
Регистрация: 12.09.2011
Сообщений: 42
13.09.2011, 17:54  [ТС]     работа с файлами #16
да безразницы...............
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
13.09.2011, 18:24     работа с файлами #17
Цитата Сообщение от s92p Посмотреть сообщение
Удалить из текста, находящегося в файле, каждое четное предложение.
Тут все просто, для работы с файлами нужно просто перенаправить ввод/вывод (это нормальный подход, unix-way блин ) :
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdlib.h>
#include <stdio.h>
 
int main() {
    int idx = 0, nbytes = 100;
    char *str = NULL;
    
    if ((str = (char *)malloc(nbytes)) == NULL) {
        fprintf(stderr, "failure to memory allocate\n");
        exit(EXIT_FAILURE);
    }
    
    while (getline(&str, &nbytes, stdin) != -1) {
        /* if first line is odd use prefix increment
         * else use postfix
        */
        if (++idx % 2 != 0)
            fprintf(stdout, "%s", str);
    }
 
    free (str);
    return EXIT_SUCCESS;
}
Однако, я не тестировал
s92p
11 / 11 / 0
Регистрация: 12.09.2011
Сообщений: 42
14.09.2011, 08:30  [ТС]     работа с файлами #18
чтот ругается он на строчку
C
1
  while (getline(&str, &nbytes, stdin) != -1) {
13: undefined reference to `getline'
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
14.09.2011, 10:02     работа с файлами #19
Цитата Сообщение от s92p Посмотреть сообщение
чтот ругается он на строчку
видимо в windows такой функции нет
В таком случае попробуйте вот так, но не будет работать со строками длиной больше nbytes.
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
#include <stdlib.h>
#include <stdio.h>
 
int main() {
    int idx = 0, nbytes = 100;
    char *str = NULL;
    
    if ((str = (char *)malloc(nbytes)) == NULL) {
        fprintf(stderr, "failure to memory allocate\n");
        exit(EXIT_FAILURE);
    }
    
    while (fgets(str, nbytes, stdin) != NULL) {
        /* if first line is odd use prefix increment
         * else use postfix
        */
        if (++idx % 2 != 0)
            fprintf(stdout, "%s", str);
    }
 
    if (!feof(stdin) && ferror(stdin)) {
        fprintf(stderr, "failure to read\n");
                free(str);
        exit(EXIT_FAILURE);
    }
 
    free (str);
    return EXIT_SUCCESS;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2011, 10:21     работа с файлами
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
15.09.2011, 10:21     работа с файлами #20
Цитата Сообщение от s92p Посмотреть сообщение
Удалить из текста, находящегося в файле, каждое четное предложение.
то же на C
Вот код и скрин работы
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
#include <windows.h>//malloc
#include <string.h> //strtok
#include <stdio.h>  //i/o
 
int main()
{
    SetConsoleOutputCP(1251); //Устанавливаем кодировку вывода в консоли на русскую
                              //Нужно будет только установить в свойствах консоли шрифт Lusinda Console
    long i,sLen;
    char * str, *buf;
    char delim[] = ".!?";//Разделители предложений
    FILE * f = fopen("text.txt","rb+");
    if(!f)
        printf("Ошибка открытия text.txt\r\n");
    else
    {
        fseek(f,0,SEEK_END);//Курсор вконец файла
        sLen = ftell(f);    //Текущая позиция курсора == длине файла
        fseek(f,0,SEEK_SET);//Курсор вначало файла
        
        if(!(str =(char *)malloc(sLen + 1)))
            printf("Ошибка выделения памяти\r\n");
        else
        {
            fread(str,sLen,1,f);//Читаем в буффер сразу весь файл
            str[sLen] = '\0';//0 вконеце строки
        }
        fclose(f);
        if(str)//Если произвели чтение
        {
            i = 1;//Счётчик предложений
            if(!(buf = strtok(str,delim)))
                printf("Текст в файле не содержит предложений!\r\n");
            else
            while(buf)
            {
                if(i % 2 != 0)//Выводим нечётные предложения
                    printf("\t[Предложение # %d] :\r\n%s.\r\n",i,buf);
                buf = strtok(NULL,delim);
                i++;
            }
        }
    }
    system("pause");//Ждём нажатия любой клавиши на клавиатуре
    return 0;
}
Для руссификации вывода применил функцию SetConsoleOutputCP(1251); - для русского вывода необходимо ещё в свойствах консоли выставить шрифт Lusinda Console иначе русский будет выводиться какракулями(на миниатюре пояснил как установить шрифт - это нужно будет сделать всего 1-раз и наслаждаться русским выводом)
Миниатюры
работа с файлами   работа с файлами  
Вложения
Тип файла: txt text.txt (3.4 Кб, 8 просмотров)
Yandex
Объявления
15.09.2011, 10:21     работа с файлами
Ответ Создать тему
Опции темы

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