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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
zago-vlad
13 / 8 / 1
Регистрация: 12.01.2010
Сообщений: 106
10.10.2011, 20:26     Вопросы по C++ #1
Всем привет!
У меня появилось несколько вопросов по C++, был бы рад, если бы Вы помогли бы мне хотя бы из одним из них.

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

Заранее большое спасибо!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2011, 20:26     Вопросы по C++
Посмотрите здесь:

C++ Вопросы
C++ Вопросы
C++ Вопросы начинающего
Житейские вопросы по С++ C++
C++ Вопросы по C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
10.10.2011, 20:30     Вопросы по C++ #2
Цитата Сообщение от zago-vlad Посмотреть сообщение
1) Как узнать количество строк в файле;
посчитать вхождения '\n'
Цитата Сообщение от zago-vlad Посмотреть сообщение
2) Как узнать количество символов в файле;
переместится в конец файла, а потом посмотреть чему равен seekg
Цитата Сообщение от zago-vlad Посмотреть сообщение
3) Как узнать количество символов в отдельной строке файла;
считать символы до вхождения '\n'
Цитата Сообщение от zago-vlad Посмотреть сообщение
4) Как считать каждую строку в отдельный массив символов (char);
getline в помощь
zago-vlad
13 / 8 / 1
Регистрация: 12.01.2010
Сообщений: 106
10.10.2011, 20:34  [ТС]     Вопросы по C++ #3
Gepar, спасибо за помощь, с четвёртым разобрался, а можешь привести примеры кода с первого по третье?
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
11.10.2011, 00:21     Вопросы по C++ #4
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;
}
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
11.10.2011, 05:45     Вопросы по C++ #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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() для текстовых потоков возвращает индикатор файловой позиции (какое-то число, которое равно чему-то)
zago-vlad
13 / 8 / 1
Регистрация: 12.01.2010
Сообщений: 106
11.10.2011, 08:32  [ТС]     Вопросы по C++ #6
Спасибо! С вопросами 1-4 разобрался!
А как быть с вопросами 5-7?
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
11.10.2011, 09:32     Вопросы по C++ #7
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);
}
Код
[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;
}
Код
[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;
}
Код
[guest@localhost tests]$ .ansi t.c -o t
[guest@localhost tests]$ ./t
4
1234 5678 91011 12
[guest@localhost tests]$
zago-vlad
13 / 8 / 1
Регистрация: 12.01.2010
Сообщений: 106
11.10.2011, 10:22  [ТС]     Вопросы по C++ #8
А как быть с пятым?
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
11.10.2011, 10:55     Вопросы по C++ #9
чего ?
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
11.10.2011, 11:00     Вопросы по C++ #10
Цитата Сообщение от zago-vlad Посмотреть сообщение
А как быть с пятым?
Считывайте по символу и проверяйте является ли он цифрой, если точно знаете что они идут через пробел то проверяйте каждый второй символ.
C++
1
2
3
4
    int count;
    char ch=file.get();
    if (isdigit(ch))
     count++;
Потом создадите массив размера count и закинете туда свои числа.
Хотя это некрасивый вариант и можно схитрить: узнать количество символов в строке, разделить число на 2 и создать массив такого размера куда при первом проходе строки и помещать уже цифры
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.10.2011, 13:27     Вопросы по C++ #11
А как понимать это выражение в fscanf:

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

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

Добавлено через 7 минут
И еще один вопрос:
как узнать самое большое число в массиве?
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.10.2011, 18:43     Вопросы по C++ #13
Цитата Сообщение от 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];
}
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
11.10.2011, 19:45     Вопросы по C++ #14
Цитата Сообщение от 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' и удаляем его из потока.

Не по теме:

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

talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.10.2011, 19:48     Вопросы по C++ #15
Кстати, пока не забыл: есть ли в си аналог std :: istream :: putback( char ch ) ?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
11.10.2011, 19:53     Вопросы по C++ #16
ungetc(), оно?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2011, 19:55     Вопросы по C++
Еще ссылки по теме:

Вопросы по С++ C++
C++ вопросы новичка
Вопросы по C++ C++

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

Или воспользуйтесь поиском по форуму:
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.10.2011, 19:55     Вопросы по C++ #17
Угу, оно, спасибо.
Yandex
Объявления
11.10.2011, 19:55     Вопросы по C++
Ответ Создать тему
Опции темы

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