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

Вопросы по C++

10.10.2011, 20:26. Показов 1957. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
У меня появилось несколько вопросов по C++, был бы рад, если бы Вы помогли бы мне хотя бы из одним из них.

1) Как узнать количество строк в файле;
2) Как узнать количество символов в файле;
3) Как узнать количество символов в отдельной строке файла;
4) Как считать каждую строку в отдельный массив символов (char);
5) Есть строка с N-ым количемством чисел, записаных через пробел. Нужно узнать их количество, создать массив с таким же количеством элементов и скопировать эти числа в получившийся массив;
6) Как узнать количесво цифр в числе;
7) Как узнать сумму цифр в числе.

Заранее большое спасибо!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.10.2011, 20:26
Ответы с готовыми решениями:

Когда вопросы кончаются, сделать кнопку неактивной и вывести сообщение о том, что вопросы кончились
Кто знает ребят подскажите в чем проблема, есть метод обновляющий текст в TextView (всего 6 вопросов). Так вот когда вопросы кончаются...

Qt Вопросы
Подскажите, пожалуйста в С# есть Tool Strip Menu(типа кнопочки вверху окна например Файл, Правка, ... , Справка), что похожего есть в Qt и...

Вопросы..
Всем добрый день. Пожалуйста подскажите ответы на следующие вопросы, хочу сразу извиниться за свою недальнозоркость и ламачество :(, совсем...

16
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
10.10.2011, 20:30
Цитата Сообщение от zago-vlad Посмотреть сообщение
1) Как узнать количество строк в файле;
посчитать вхождения '\n'
Цитата Сообщение от zago-vlad Посмотреть сообщение
2) Как узнать количество символов в файле;
переместится в конец файла, а потом посмотреть чему равен seekg
Цитата Сообщение от zago-vlad Посмотреть сообщение
3) Как узнать количество символов в отдельной строке файла;
считать символы до вхождения '\n'
Цитата Сообщение от zago-vlad Посмотреть сообщение
4) Как считать каждую строку в отдельный массив символов (char);
getline в помощь
1
13 / 8 / 1
Регистрация: 12.01.2010
Сообщений: 106
10.10.2011, 20:34  [ТС]
Gepar, спасибо за помощь, с четвёртым разобрался, а можешь привести примеры кода с первого по третье?
0
 Аватар для xAtom
935 / 760 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
11.10.2011, 00:21
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
#include <stdio.h>
long  fileSize(FILE* fp);
int  fileLine(FILE* fp);
int  fileLineSizeAt(FILE* fp, int index);
 
int main(void) {
   FILE* fp = fopen("D:\\config.ini", "r");
   if(! fp)
      return 1;
   printf("file   size: %d\n",   fileSize(fp) );  // вывести размер файла
   printf("file  lines: %d\n",   fileLine(fp) );  // вывести кол-во строк в файле
   printf("line length: %d\n", fileLineSizeAt(fp, 2) );  // вывести размер 3-ей строки
   fclose(fp);
   getchar();
   return 0;
}
 
// размер файла в байтах
long  fileSize(FILE* fp) {
    long cnt;
    fseek(fp, 0L, SEEK_END);
    cnt = ftell(fp);
    return cnt;
}
 
// кол-во строк в файле
int  fileLine(FILE* fp) {
   long cnt = 0L;
   char ch  = 0;
   fseek(fp, 0L, SEEK_SET);
   while(fscanf(fp, "%*[^\n]%c", &ch) == 1) 
         cnt++;
   return cnt;
}
 
// размер строки по-индексу начало индекса с нуля как и массив
int  fileLineSizeAt(FILE* fp, int index) {
   long pos;
   char ch  = 0;    
   rewind(fp);
   for(int i = 0; i < index && ! feof(fp); i++) 
        fscanf(fp, "%*[^\n]%c", &ch);
   if(! feof(fp)) {
         pos = ftell(fp);
         fscanf(fp, "%*[^\n]%c", &ch);
         return ftell(fp) - pos - 2L; //(2-\n\r)
    }
    return 0L;
}
2
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
11.10.2011, 05:45
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от zago-vlad
2) Как узнать количество символов в файле;
открыть его в двоичном режиме и считывать символы, пока не встретится конец файла

Цитата Сообщение от xAtom
C++
1
2
3
4
5
6
7
// размер файла в байтах
long  fileSize(FILE* fp) {
    long cnt;
    fseek(fp, 0L, SEEK_END);
    cnt = ftell(fp);
    return cnt;
}
fseek() с SEEK_END к двоичному потоку применять нельзя
ftell() для текстовых потоков возвращает индикатор файловой позиции (какое-то число, которое равно чему-то)
3
13 / 8 / 1
Регистрация: 12.01.2010
Сообщений: 106
11.10.2011, 08:32  [ТС]
Спасибо! С вопросами 1-4 разобрался!
А как быть с вопросами 5-7?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
11.10.2011, 09:32
6)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
int ndigits(int n);
 
int main(void)
{
    printf("%d %d %d\n", ndigits(12345), ndigits(0), ndigits(123));
    printf("%d %d %d\n", ndigits(-12345), ndigits(0), ndigits(-123));
    return 0;
}
 
int ndigits(int n)
{
    if (n == 0)
        return 0;
    return 1 + ndigits(n / 10);
}
Code
1
2
3
4
5
[guest@localhost tests]$ .ansi t.c -o t
[guest@localhost tests]$ ./t
5 0 3
5 0 3
[guest@localhost tests]$
для нуля возвращает ноль цифр

Добавлено через 10 минут
7)
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
 
#include <stdio.h>
 
int sumdigits(int n);
 
int main(void)
{
    printf("%d %d %d\n", sumdigits(12345), sumdigits(0), sumdigits(123));
    printf("%d %d %d\n", sumdigits(-12345), sumdigits(0), sumdigits(-123));
    return 0;
}
 
int sumdigits(int n)
{
    int neg, v;
    
    if (n == 0)
        return 0;
    neg = 0;
    if (n < 0) {
        neg = 1;
        n = -n;
    }
    v = n % 10 + sumdigits(n / 10);
    return neg ? -v : v;
}
Code
1
2
3
4
5
[guest@localhost tests]$ .ansi t.c -o t
[guest@localhost tests]$ ./t
15 0 6
-15 0 -6
[guest@localhost tests]$
Добавлено через 11 минут
5)
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
 
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    const char *s = "1234 5678 91011 12";
    int n, offset, tmp;
    int *arr, i;
    
    n = offset = 0;
    while (sscanf(s + offset, "%*d%n", &tmp) == 0) {
        offset += tmp;
        n++;
    }
    
    printf("%d\n", n);
    
    arr = (int *) malloc(n * sizeof(int));
    if (arr == NULL)
        return 1;
 
    i = offset = 0;
    while (sscanf(s + offset, "%d%n", arr + i, &tmp) == 1) {
        offset += tmp;
        i++;
    }
    
    for (i = 0; i < n; i++)
        printf("%d%s", arr[i], (i + 1 < n) ? " " : "\n");
    
    free(arr);
    return 0;
}
Code
1
2
3
4
5
[guest@localhost tests]$ .ansi t.c -o t
[guest@localhost tests]$ ./t
4
1234 5678 91011 12
[guest@localhost tests]$
1
13 / 8 / 1
Регистрация: 12.01.2010
Сообщений: 106
11.10.2011, 10:22  [ТС]
А как быть с пятым?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
11.10.2011, 10:55
чего ?
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
11.10.2011, 11:00
Цитата Сообщение от zago-vlad Посмотреть сообщение
А как быть с пятым?
Считывайте по символу и проверяйте является ли он цифрой, если точно знаете что они идут через пробел то проверяйте каждый второй символ.
C++
1
2
3
4
    int count;
    char ch=file.get();
    if (isdigit(ch))
     count++;
Потом создадите массив размера count и закинете туда свои числа.
Хотя это некрасивый вариант и можно схитрить: узнать количество символов в строке, разделить число на 2 и создать массив такого размера куда при первом проходе строки и помещать уже цифры
1
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.10.2011, 13:27
А как понимать это выражение в fscanf:

Цитата Сообщение от xAtom Посмотреть сообщение
"%*[^\n]%c"
Звёздочка - понятно, прочтённый символ никуда не сохраняется. А что такое [^\n] ?

Добавлено через 4 минуты
Gepar, в числе-то может быть не одна цифра. + ещё floating-point, вроде 12.4 или 4e8
0
13 / 8 / 1
Регистрация: 12.01.2010
Сообщений: 106
11.10.2011, 18:40  [ТС]
Цитата Сообщение от accept Посмотреть сообщение
чего ?
Сорри, просматривал тему когда ты еще не добавил решения пятого, а потом зашел обратно через полчаса и, не заметив то, что ты написал решение пятого, написал:
"А как быть с пятым?"

Добавлено через 7 минут
И еще один вопрос:
как узнать самое большое число в массиве?
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.10.2011, 18:43
Цитата Сообщение от zago-vlad Посмотреть сообщение
как узнать самое большое число в массиве?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
int array[8];
 
// ..
 
int i;
 
int max = array[0];
 
for( i = 0; i < 8; i++ )
{
   if( array[i] > max )
      max = array[i];
}
1
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.10.2011, 19:45
Цитата Сообщение от talis Посмотреть сообщение
А как понимать это выражение в fscanf:
C
1
"%*[^\n]%c"
Звёздочка - понятно, прочтённый символ никуда не сохраняется. А что такое [^\n] ?
[^\n] - считать последовательность символов, пока не встретиться '\n', поскольку перед квадратными скобками звездочка, значит игнорировать эти символы. %c - считываем сам '\n'.
Все вместе:
C
1
2
 while(fscanf(fp, "%*[^\n]%c", &ch) == 1) 
         cnt++;
считается кол-во строк в файле.

Я обычно вместо gets() пишу такую конструкцию:
C
1
scanf("%[^\n]*%c", str);
считываем строку до символа '\n' и удаляем его из потока.

Не по теме:

Хотя конечно это просто "чтоб запутать потенциального противника":D

2
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.10.2011, 19:48
Кстати, пока не забыл: есть ли в си аналог std :: istream :: putback( char ch ) ?
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.10.2011, 19:53
ungetc(), оно?
1
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.10.2011, 19:55
Угу, оно, спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.10.2011, 19:55
Помогаю со студенческими работами здесь

Вопросы по БД
Все привет! Начал как бы заниматься программированием и возникли некоторые вопросы с БД. Первый Вопрос. Как лучше всего...

Вопросы
Ребята, никто не писал никогда код на С++, связанный с имитационным моделированием? Просто, дали, там набор математич. формул и теория, а...

Вопросы по с/с++
Хотелось бы узнать , есть ли сайты по с\с++ которые содержат только вопросы и ответы по всем темам. Как тесты. Если не понятно как я...

Вопросы :)
1) Подскажите, пожалуйста, как подсчитать позицию моего сайта в разных поисковиках по определенному ключу? То есть чтобы иметь возможность...

Вопросы по C++
Пожалуй начну) Можно ли в С++, обьявить определенному элементу массива определенное значение, как можно в пхп? Приведу пример: php:...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru