Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
АннаКартер
0 / 0 / 0
Регистрация: 14.01.2015
Сообщений: 16
#1

Массив считать из файла, отсортировать по возрастанию и записать в новый файл - C++

21.06.2015, 22:30. Просмотров 602. Ответов 11
Метки нет (Все метки)

Создаем текстовый файл из num строК, каждая строка содержит трехразрядное число сгенерированное, далее функция читает содержимое файла в массив, сортирует массив по возрастанию его элементов, записывает упорядоченный массив в новый файл. Функция возвращает целое число, равное общему количеству сравнений элементов массива в процессе сортировки


Выдает ошибку:
Debug Assertion Failed
File: minkernel\crts\ucrt\src\appcrt\stdio\fgetc.cpp
Line:43
Expression: streamvalid()

Утверждение является ложным и не выполняется. Не подскажите, как исправить??

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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include "stdafx.h"
#include "math.h"
#include <iostream>
#include <ctime>
#include <cstring>
#include <stdio.h>
#include <fstream>
#include <conio.h>
#include <cstdlib>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <clocale>
using namespace std;
void GenerateDataset(char *filename, int num)
{
    ofstream F;
    F.open("filename.txt", ios::out);
    srand(time(0));
    for (int i = 1; i <= num; i++)
    {
        F << rand() % 899 + 100 << endl;
    }
    F.close();
}
int SortDataset(char *filename)
{
    FILE *stream;
    fopen_s(&stream, filename, "r");
    int k = 0;
    char symbol;
    while ((symbol = fgetc(stream)) != EOF) { k++; }
 
    _fcloseall();
    fopen_s(&stream, filename, "r");
    char *line, chislo1[4], chislo2[4], mass[4];
    line = (char *)malloc(k *sizeof(char));
    for (int j = 0; j<k; j++)
    {
        *(line + j) = fgetc(stream);
 
    }
    int kol = 0, indicator = 0;
    for (int i = 0; i<k / 4 - 1; i++)
    {
        for (int j = 0; j<k / 4 - 1 - i; j++)
        {
            for (int h = 0; h<4; h++)
            {
                chislo1[h] = *(line + j * 4 + h);
                chislo2[h] = *(line + j * 4 + h + 4);
            }
            for (int h = 0; h<4; h++)
            {
                if (chislo1[h]<chislo2[h])
                {
                    for (int f = 0; f<4; f++)
                    {
                        mass[f] = chislo1[f];
                        chislo1[f] = chislo2[h];
                        chislo2[h] - mass[h];
                        indicator = 1;
                    }
                    kol++;
                    if (indicator>0)break;
                }
                indicator = 0;
                for (int f = 0; f<4; f++)
                {
                    *(line + j * 4 + f) = chislo2[f];
                    *(line + j * 4 + f + 4) = chislo1[f];
                }
            }
        }
    }
    _fcloseall();
    filename = "C://Users/Админ/Documents/Visual_Studio_2015/Projects/l/l/filename.txt.sort";
    FILE *streamSort;
    fopen_s(&streamSort, filename, "w");
    for (int j = 0; j<k; j++) { putc(*(line + j), streamSort); }
    _fcloseall();
    return kol;
}
int main()
{
    int num;
    printf("num = "); scanf_s("%i", &num);
    char name[] = "C://Users/Админ/Documents/Visual_Studio_2015/Projects/l/l/filename.txt";
    char *filename = name;
    GenerateDataset(filename, num);
    int kol = SortDataset(filename);
    printf("kol = %i\n", kol);
    float T, T1, T2;
    num = 8;
    float Rez1, Rez2;
    for (num; num <= 4096; num = num * 2)
    {
        printf("Computing num = %i\n", num);
        GenerateDataset(filename, num);
        T = SortDataset(filename);
        T1 = num*num;
        T2 = num*log(num) / log(2);
        Rez1 = T / T1;
        Rez2 = T / T2;
        printf("T = %1.0f\nT1 = %1.0f\nT2 = %1.0f\nT/T1 = %f\nT/T2 = %f\n\n", T, T1, T2, Rez1, Rez2);
    }
    _getch();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2015, 22:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Массив считать из файла, отсортировать по возрастанию и записать в новый файл (C++):

Отсортировать числа из файла по возрастанию суммы цифр и записать в другой файл - C++
Помогите, пожалуйста В файле записано не более 100 чисел. Отсортировать их по возрастанию суммы цифр и записать в другой файл....

Нужно записать массив в файл, а потом из этого файла считать этот же массив - C++
Помогите, пожалуйста, никогда с файлами делов не имела. Нужно записать массив в файл, а потом из этого файла считать этот же массив. ...

Считать массив из файла, записать результаты в другой файл - C++
Программа рабочая, нужно переделать, так чтобы массив считывался из файла и сумма со средним арифметическим выводилась, и на экран, и в...

Считать из этого файла какой-либо символ и записать этот символ в новый файл - C++
здравствуйте , помогите с решением следующего задания: естьтекстовый файл vvod.txt, в нем записана строка. мне нужно считать из этого...

Считать из файла, поменять регистр и записать в новый - C++
Здравствуйте программа меняет первую букву слова с нижнего на верхний регистр #include &lt;windows.h&gt; #include &lt;iostream&gt; using...

Вычислить y= k14− 18 k для 6 значений k, вводимых с клавиатуры. Результат вычислений записать в массив. Полученный массив отсортировать по возрастанию - C++
#include&lt;iostream&gt; #include&lt;math.h&gt; #include&lt;iomanip&gt; using namespace std; double const n=20; int vvod( double y, int n) { ...

11
_Valera_
488 / 370 / 94
Регистрация: 27.01.2015
Сообщений: 1,588
21.06.2015, 22:40 #2
Цитата Сообщение от АннаКартер Посмотреть сообщение
T2 = num*log(num) / log(2);
Мне тут дает ошибку. Нужно передпть float или double значения
0
АннаКартер
0 / 0 / 0
Регистрация: 14.01.2015
Сообщений: 16
21.06.2015, 22:45  [ТС] #3
Странно, у меня здесь нет ошибки
0
_Valera_
488 / 370 / 94
Регистрация: 27.01.2015
Сообщений: 1,588
21.06.2015, 22:53 #4
Цитата Сообщение от АннаКартер Посмотреть сообщение
Странно, у меня здесь нет ошибки
Ну не знаю...

Попробуйте на место этой строчки поставить это:
C++
1
2
float num1 = num;
T2 = num*log(num1) / log(2.0);
0
АннаКартер
0 / 0 / 0
Регистрация: 14.01.2015
Сообщений: 16
21.06.2015, 23:00  [ТС] #5
_Valera_, Ничего не изменилось, то же всплывающее окно с ошибкой
0
_Valera_
488 / 370 / 94
Регистрация: 27.01.2015
Сообщений: 1,588
21.06.2015, 23:02 #6
Цитата Сообщение от АннаКартер Посмотреть сообщение
_Valera_, Ничего не изменилось, то же всплывающее окно с ошибкой
При работе программы?
0
АннаКартер
0 / 0 / 0
Регистрация: 14.01.2015
Сообщений: 16
21.06.2015, 23:07  [ТС] #7
_Valera_, Запускается, генерирует числа в файл и далее всплывает окно с Debug
0
_Valera_
488 / 370 / 94
Регистрация: 27.01.2015
Сообщений: 1,588
21.06.2015, 23:23 #8
Цитата Сообщение от АннаКартер Посмотреть сообщение
while ((symbol = fgetc(stream)) != EOF) { k++; }
Ошибка тут стр 32.
Сейчас подумаю почему.

Добавлено через 16 минут
Цитата Сообщение от _Valera_ Посмотреть сообщение
fgetc(stream))
Ну вы что-то напутали с функцией. Я с потоками С не знаком, но если вопрос до завтра доживет, то я гляну что не так.
1
ValeryS
Модератор
6794 / 5202 / 499
Регистрация: 14.02.2011
Сообщений: 17,452
21.06.2015, 23:28 #9
Цитата Сообщение от АннаКартер Посмотреть сообщение
C++
1
2
int kol = 0, indicator = 0;
for (int i = 0; i<k / 4 - 1; i++)
сколько раз выполнится этот цикл?
0
АннаКартер
0 / 0 / 0
Регистрация: 14.01.2015
Сообщений: 16
22.06.2015, 09:19  [ТС] #10
Добавлено через 54 секунды
ValeryS, Не знаю как ответить на ваш вопрос.
Сортируем, сравнивая числа в массивах и записываем в третий
0
Max Dark
шКодер самоучка
1855 / 1655 / 603
Регистрация: 09.10.2013
Сообщений: 3,681
Записей в блоге: 6
Завершенные тесты: 2
22.06.2015, 09:29 #11
в функции GenerateDataset параметр filename не используется, тем самым файл создается в текущей рабочей директории программы
далее при чтении пытается открыть файл указанный в filename и не находит его
соответственно stream остается == NULL
дальнейшие попытки обратится к stream приводят к вашей ошибке

Не по теме:

использование нестандартных "safe" версий стандартных функций не спасает от ошибок

1
ValeryS
Модератор
6794 / 5202 / 499
Регистрация: 14.02.2011
Сообщений: 17,452
22.06.2015, 09:58 #12
Цитата Сообщение от АннаКартер Посмотреть сообщение
Не знаю как ответить на ваш вопрос.
Пардон, это я ошибся
спутал k и kol
0
22.06.2015, 09:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2015, 09:58
Привет! Вот еще темы с ответами:

прочитать массив из файла и отсортировать его по возрастанию - C++
Доброго времени суток! у меня такая задача... прочитать массив из файла и отсортировать его по возрастанию. Все значения целые и по модулю...

Считать из файла и записать массив - C++
вопрос в комментарии, подскажите пожалуйста #include &lt;iostream&gt; using namespace std; struct book { string name; int year; ...

Считать числа из файла и записать их в массив - C++
Проблема следущая: нужна программа которая считывает числа типа double из файла (в моем случае это индексы валютного курса) и записывает их...

Записать массив double в файл, и считать его - C++
Допустим есть массив double *pdArrayOfAllWeight = (double*)malloc(sizeof(double)*iSumAllWeight); Как записать этот массив в файл, не...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru