Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
11 / 11 / 1
Регистрация: 12.09.2011
Сообщений: 42

работа с файлами

12.09.2011, 15:06. Показов 1935. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
мне бы надо на 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;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.09.2011, 15:06
Ответы с готовыми решениями:

Работа с файлами , хотелось бы с windows system файлами
всем привет, нужна интересная идея по программированию, работа с файлами , хотелось бы с windows system файлами, у вас есть какая-то идея?...

Работа с файлами(Запись,чтение,работа с данными)
Здравствуйте, никак не могу осилить файлы... Для начала вот само задание: В справочной автовокзала хранится расписание движения автобусов....

Лабораторная работа №5. Работа с файлами и алгоритмы сортировки
1. Написать функцию Load для считывания из текстового файла (например, Workers.txt) информации о работниках и заработной плате. В первой...

19
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
12.09.2011, 15:08
s92p, а чего сделать то надо?
0
11 / 11 / 1
Регистрация: 12.09.2011
Сообщений: 42
12.09.2011, 15:13  [ТС]
а блин.... короче
считывает текст из файла и выводит на экран только строки, не
содержащие двузначных чисел.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
12.09.2011, 16:45
Цитата Сообщение от 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 байт, 22 просмотров)
1
11 / 11 / 1
Регистрация: 12.09.2011
Сообщений: 42
12.09.2011, 21:50  [ТС]
может еще с этим поможешь
???????????

Написать программу, которая преобразует введенное с клавиатуры восьмиразрядное
двоичное число в десятичное
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.09.2011, 09:14
Цитата Сообщение от s92p Посмотреть сообщение
Написать программу, которая преобразует введенное с клавиатуры восьмиразрядное
двоичное число в десятичное
- хорошо уже занимаюсь
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
13.09.2011, 09:36
Цитата Сообщение от 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;
}
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.09.2011, 09:38
Вот простой проект на Си
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;
}
Миниатюры
работа с файлами  
1
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
13.09.2011, 09:39
mimicria, забыли место для символа '\0' забронировать в массиве dv Понимаю, в вашем алгоритме это не нужно, но не то как-то выглядит.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.09.2011, 09:40
Цитата Сообщение от mimicria Посмотреть сообщение
for (int k=0;k<8;k++)
- а если я захочу ввести 10100 - программа тоже до 8-ми считать будет???
1
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
13.09.2011, 09:51
Очень смущает функция 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;
1
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
13.09.2011, 09:57
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
а если я захочу
В задаче ясно сказано
введенное с клавиатуры восьмиразрядное двоичное число
Я не старался сделать больше необходимого
1
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
13.09.2011, 10:29
Лучший ответ Сообщение было отмечено как решение

Решение

Как вариант еще такой метод (ввод данных не делал, так как я демонстрирую способ перевода числа, а не способ ввода с клавиатуры; и проверку строки на корректность данных тоже не делал именно поэтому ) :
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;
}
3
11 / 11 / 1
Регистрация: 12.09.2011
Сообщений: 42
13.09.2011, 16:37  [ТС]
Цитата Сообщение от 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


у меня проблема на счет записи в буфер и чтение из него
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.09.2011, 16:56
Цитата Сообщение от s92p Посмотреть сообщение
Удалить из текста, находящегося в файле, каждое четное предложение.
то же на C
- сейчас займусь - только вопрос предложения в новый файл записать или только вывести???
1
11 / 11 / 1
Регистрация: 12.09.2011
Сообщений: 42
13.09.2011, 17:54  [ТС]
да безразницы...............
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
13.09.2011, 18:24
Цитата Сообщение от 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;
}
Однако, я не тестировал
0
11 / 11 / 1
Регистрация: 12.09.2011
Сообщений: 42
14.09.2011, 08:30  [ТС]
чтот ругается он на строчку
C
1
  while (getline(&str, &nbytes, stdin) != -1) {
13: undefined reference to `getline'
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
14.09.2011, 10:02
Цитата Сообщение от 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;
}
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
15.09.2011, 10:21
Цитата Сообщение от 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 Кб, 9 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.09.2011, 10:21
Помогаю со студенческими работами здесь

Работа с файлами, чтение/работа со строкой
Доброго времени суток. Начал работать с C++ Builder 6. Есть текстовый файл .txt с различными строками, как можно производить...

Работа с файлами
Создается форма, на форме текстовое поле и кнопка, по нажатию на которую создается файл и в него записываются данные с тестового поля. ...

Работа с файлами
Составьте программу, которая считает какое слово в текстовом файле встречается чаще всего и записывает его в новый файл.если таких слов...

Работа с файлами
Здравствуйте! Возникла проблема. У меня есть класс MPage, его конструктор подгружает через функцию file_get_contents . Шаблон в виде: ...

Работа с файлами
Вроде как и задача простая, но почему-то выдает ошибку. Задача состоит в том,что нужно сделать вычисления и записать ответ в файл. ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru