0 / 0 / 0
Регистрация: 24.11.2016
Сообщений: 33
1

Файловые потоки, перевод строки чисел в массив

08.12.2016, 23:46. Показов 2442. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В текстовом файле INPUT.TXT записаны целые числа через пробел, возможно, в несколько строк. За один просмотр файла сформировать список этих чисел и найти среднее арифметическое элементов списка. Полученное значение занести в текстовый файл OUTPUT.TXT.

Запрещено использовать тип данных string, но можно использовать строковые функции: strcmp, strcpy, strlen и т.д. Т.е. под запретом только самостоятельный тип данных string. Использовать нужно char*, чтение из файла организуете путем считывания всей строки с помощью функции getline.

допустим строки я считать смогу, но как их перевести в массив чисел? Нужно это сделать используя функцию atoi()
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2016, 23:46
Ответы с готовыми решениями:

Файловые потоки (считать цифры из файла в массив)
У меня есть файл в котором находятся цифры, как мне считать их в массив? #include <iostream>...

Файловые потоки: узнать номер самой длинной строки и её размер
Я с файла считываю информацию, а мне нужно узнать номер самой длинной строки и её размер

Перевод строки в массив чисел
На входе, строка и известно сколько в этой строке должно быть чисел. Все числа состоят из 4 цифр. ...

Перевод строки в массив чисел
Здравствуйте, форумчане. Я новичок в программировании, поэтому, может быть, задаю глупый вопрос) ...

16
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,617
09.12.2016, 09:50 2
Зачем тебе вообще строки, если в файле только числа? Считывай сразу в int.
0
0 / 0 / 0
Регистрация: 30.09.2016
Сообщений: 4
09.12.2016, 10:11 3
Это идёт по заданию нужно считать именно строку getline
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,617
09.12.2016, 10:14 4
Ну тогда atoi().
С getline() ты только усложнишь всё. Придётся делить её на части, это ещё один лишний цикл.
0
0 / 0 / 0
Регистрация: 30.09.2016
Сообщений: 4
09.12.2016, 11:00 5
Ну в этом то вся и суть, что ничего ненадо упрощать
0
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
09.12.2016, 12:54 6
Цитата Сообщение от MeteoR74 Посмотреть сообщение
ничего ненадо упрощать
^ quality programming right there lads.

Цитата Сообщение от MeteoR174 Посмотреть сообщение
но как их перевести в массив чисел
Считываешь файл, и у тебя выходит что-то типа 1 2 3 4 5\n6 7 8 9 10 (без второй строки будет 1 2 3 4 5) в твоей переменной cosnt char *. Делаешь функцию с параметрами const char *, и, так как не запрещено использовать sstream и vector, делаешь примерно так:

C++
1
2
3
4
5
6
7
8
9
10
11
std::vector<int> split(const char * text)
{
    std::vector<int> numbers;
 
    std::stringstream sStr(text);
 
    for (int var; sStr >> var;) 
        numbers.emplace_back(var);
 
    return numbers;
}
Добавлено через 1 минуту
Тебе эта функция вернет вектор, содержащий числа 1, 2, 3, 4, 5;, в случае параметра const char * типа "1 2 3 4 5"
0
0 / 0 / 0
Регистрация: 24.11.2016
Сообщений: 33
09.12.2016, 18:53  [ТС] 7
Абсолютно не то... не проходили даже близко эти темы. может быть это и кажется проще, но нужно по-другому

Добавлено через 3 часа 35 минут
Цитата Сообщение от nmcf Посмотреть сообщение
Ну тогда atoi().
С getline() ты только усложнишь всё. Придётся делить её на части, это ещё один лишний цикл.
Покажите мне реализацию этого варианта
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,617
09.12.2016, 19:06 8
C++
1
2
3
4
5
6
7
8
char n[15];
int a[100], i = 0;
 
while (infile >> n)
{
    a[i] = atoi(n);
    ++i;
}
0
0 / 0 / 0
Регистрация: 24.11.2016
Сообщений: 33
11.12.2016, 16:08  [ТС] 9
Так ладно забудем файлы, есть строка str в ней записаны числа через пробел (3 2412 45 890 212 74 1 67), как мне используя atoi добиться массива чисел (например m[0] = 3, m[1] = 2412, m[2] = 45 и т. д.) чисел в строке может быть разное количество, поэтому необходим динамический массив
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,617
11.12.2016, 16:41 10
strtok() + atoi(). Ну выдели память с запасом.
0
0 / 0 / 0
Регистрация: 24.11.2016
Сообщений: 33
11.12.2016, 17:00  [ТС] 11
еще проще
C++
1
2
char *str = { "3 2412 45 890 212 74 1 67" };
    cout << atoi(str+i);
при i = 0 выводится 3 - все ок, дальше при i = 1 выводится 2412 - то же все норм, но вот при i = 2 получается тоже 2412, при i = 3 получается 412. Как избавиться от этих лишних иттераций, чтобы atoi сразу переходил на нужное число?
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,617
11.12.2016, 18:29 12
Так не получится. Тогда ищи предварительно позицию пробела через strchr().
0
0 / 0 / 0
Регистрация: 24.11.2016
Сообщений: 33
11.12.2016, 18:30  [ТС] 13
Тоже вариант. Покажите как сделать
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,617
11.12.2016, 19:29 14
C++
1
2
3
4
5
char *str = { "3 2412 45 890 212 74 1 67" };
char *p;
int i, a[100];
 
for (i = 0, p = str; *p != '\0'; ++i) a[i] = strtol(p, &p, 10);
0
0 / 0 / 0
Регистрация: 24.11.2016
Сообщений: 33
11.12.2016, 19:37  [ТС] 15
Немного хитроумнее сделано, но сделано, однако при попытке освободить память выдает ошибку.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void main()
{
    int c, n = 0;
    int *m = new int[n];
    char *str = { "3 2412 45 890 212 74 1 67" };
    char *ps = str;
    m[0] = atoi(str);
    while (ps = strchr(ps, ' ')) 
    {
        n++;
        c = atoi(str + (ps++ - str));
        m[n] = c;
    }
    for (int i = 0; i <= n; i++)
        cout << m[i] << " ";
    delete[] m;
}
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,617
11.12.2016, 20:02 16
Лучший ответ Сообщение было отмечено MeteoR174 как решение

Решение

Цитата Сообщение от MeteoR174 Посмотреть сообщение
при попытке освободить память выдает ошибку
Ты её не выделял. Размер укажи как положено.

В 11-й строке лишнего написал.
C++
1
c = atoi(ps++);
И c не нужна - сразу в массив.
0
0 / 0 / 0
Регистрация: 24.11.2016
Сообщений: 33
11.12.2016, 20:45  [ТС] 17
Вот оно общее решение если вдруг кому пригодится потом, спасибо все кто помогал
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
#include <iostream>
#include <fstream>
using namespace std;
 
void main()
{
    setlocale(LC_ALL, "russian");
    ifstream in("c:\\text\\INPUT.txt");
    if (!in)
        cout << "Ошибка открытия файла" << endl;
    char str[1000];
    int n = 0;
    int *m = new int[1000];
    while (in.getline(str, 1000))
    {
        int c;
        char *ps = str;
        m[n] = atoi(str);
        while (ps = strchr(ps, ' '))
        {
            n++;
            c = atoi(ps++);
            m[n] = c;
        }
        n++;
    }
    in.close();
    int sum = 0;
    for (int i = 0; i < n; i++)
        sum += m[i];
    double sa = (double) sum / n ;
    ofstream out("c:\\text\\OUTPUT.txt");
    out << "Среднее арифметическое = " << sa;
    out.close();
    for (int i = 0; i < n; i++)
        cout << m[i] << " "<< endl;
    cout << "Программа выполнена смотрите файл OUTPUT.TXT " << endl;
    cout << n << endl;
    delete[] m;
}
0
11.12.2016, 20:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.12.2016, 20:45
Помогаю со студенческими работами здесь

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

Перевод строки CString в массив чисел
Здравствуйте. Имеется строка CString вида S1S2S3S12S12S0S10S То есть символы S чередуются с...

Перевод строки в массив чисел (int32)
Доброго времени суток ! Необходимо считать информацию c textbox1.Text (в данной строке находятся...

CLR перевод строки в массив чисел
записано в Label числа через пробел. туда они считываются из файла. мне надо их записать в массив...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru