|
68 / 41 / 14
Регистрация: 24.02.2013
Сообщений: 250
|
||||||||||||||||
Загрузка динамического массива и матрицы из файла14.12.2013, 12:43. Показов 2303. Ответов 13
Метки нет (Все метки)
Здравствуйте!
Мне нужна помощь в считывании чисел из файла в массив указателей на int. В краце-я хочу, чтобы из файла программа загружала сразу в динамический массив. Сперва, я открываю файл в переменную указатель на файл(FILE*). После этого, я выполняю проход по всем строкам файла. Чтобы перейти к новой троке, я заношу значение из текущей в int* temp(используя функцию fscanf). Это я делаю для того, чтобы узнать размерность массива(кол-ство элементов). При каждом выполнении fscanf я наращиваю переменную по указателю int* size((*size)++). После того, как программа прошла по всему файлу, программа закрывает файл FILE*, после чего открывает его заново(т.к. после while(!feof(file)) программа дошла до конца файла, а читать массив надо с начала). Далее, я создаю(выделяю память) под массив int* mas=new int[(*size)](размерность массива находится по указателю *size). Однако, проблема начинается тогда, когда я пытаюсь записать из файла в массив. Когда я пытаюсь записать в массив элемент, оно, как я понимаю, ничего не записывает в массив. Я выполняю запись в массив след. образом: Кликните здесь для просмотра всего текста
Однако, при выводе массива: Кликните здесь для просмотра всего текста
Программа вводит числа, на подобии -868050... т.е. те, которые по умолчанию, занесены в элементы массива(наименьшее число int). В чём может быть проблема? Вот весь код программы(точнее сценария case 9): Кликните здесь для просмотра всего текста
0
|
||||||||||||||||
| 14.12.2013, 12:43 | |
|
Ответы с готовыми решениями:
13
Заполнение динамического массива из файла, где в первой строке указан размер массива, а вторая строка содержит значения Удаление двумерного динамического массива (матрицы) Чтение из файла динамического массива. |
|
|
|||
| 14.12.2013, 13:21 | |||
|
Добавлено через 13 минут
0
|
|||
|
68 / 41 / 14
Регистрация: 24.02.2013
Сообщений: 250
|
||||||
| 14.12.2013, 16:21 [ТС] | ||||||
|
programina, По поводу temp:
Значение в указателе *temp менялось. По умолчанию-оно равно 0. Каждый раз при чтении из файла оно увеличивается на 1-цу(иными словами-так я указываю обращение к I-му(грубо говоря) элементу массива). Ну, ладно, допустим, что значение в *temp-не изменялось. Но, оно же, по логике, тогда остаётся равно нулю(0). Значит-программа должна записывать число из файла в 1-й элемент массива(точнее в нулевой, т.к. счёт начинается с нуля). Но, все элементы массива, если выводить массив через цикл for (int I=0; I<(*size); I++) printf("%d\n", mas[I]), равны -86...(в общем-наименьший int, которому и равны все элементы массива по умолчанию, сразу после выделения памяти под массив)... Более того-программа вылетает с ошибкой об отсутствии доступа к адресу. Я немного не понимаю, почему? Мы просто сравниваем значение в *size(я отдельно проверял это число-там было число 4, и в файле у меня было всего 4 числа, каждое число начиналось с новой строки. Иными словами-в файле числа хранились построчно). Казалось бы, должно всё работать... Как я понимаю-основная ошибка как раз не с *temp и не с *size, а с записью в массив... Просто, даже если предположить, что программа не может записать в 2-й и т.д. элементы массива, то почему она не записывает даже в 1-й элемент? P.S. Ошибка вылетала, когда я пытался просмотреть массив... И это, достаточно странно... Просто, я сильно не хочу использовать статические переменные... Хочу, что бы программа использовала переменные лишь тогда, когда это реально необходимо... Программа сама по себе, пусть и простая, но, тем не менее... Добавлено через 2 минуты Как я и писал-я сперва прохожу по файлу, дабы узнать, под сколько элементов мне надо выделить массив. После этого, я закрываю файл и открываю его заного(может быть, к стати, в этом и проблема... Если да-то подскажите пожалуйста другой способ получения информации о том, сколько в файле находится строк? Просто-у меня-кол-ство строк = кол-ство элементов в будущем массиве)... Далее, выделяю память под массив в указателе int* mas. После чего-читаю уже числа из файла в массив... Добавлено через 13 минут Вот код всей программы(если интересно). Программу пишу, просто, "для закрепления знаний"... Просто, если бы я использовал статические переменные-всё было бы куда проще... Но, просто не хочу статику... Кликните здесь для просмотра всего текста
0
|
||||||
|
|
|
| 14.12.2013, 17:23 | |
|
C++ int* data=new int; fscanf(finish_file, "%d", &(*data));
0
|
|
|
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
| 14.12.2013, 17:25 | |
|
Jack Wade, среда какая?
0
|
|
|
68 / 41 / 14
Регистрация: 24.02.2013
Сообщений: 250
|
||
| 14.12.2013, 17:32 [ТС] | ||
|
Так зачем мне это, если я хочу создавать массив по мере необходимости? Хочу узнать сперва, сколько элементов надо под массив, потом выделить его для указателя *mas, после чего уже и занести в массив по указателю *mas... Добавлено через 19 секунд alsav22, Microsofr Visual Studio 2012. Добавлено через 6 минут Можно конечно выделить сразу памяти под BUFSIZ элементов... Но зачем? Зачем использовать массив из 1000(например) элементов, когда в самом то массиве будет 10 элементов?
0
|
||
|
|
|
| 14.12.2013, 17:37 | |
|
Jack Wade, тогда сканфируй файл два раза
![]() C++ #include <cstdio> int main() { int res = 1; int temp = 0; int kol = 0; int buf; FILE *f; f = fopen("f.txt", "rt"); while(1) { res = fscanf(f, "%d", &buf); if(res < 1) break; kol++; } rewind(f); res = 1; int *mas = new int[kol]; while(1) { res = fscanf(f, "%d", &mas[temp++]); if(res < 1) break; } fclose(f); for(int i = 0; i < kol; i++) printf("%d\n", mas[i]); delete [] mas; }
1
|
|
|
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
| 14.12.2013, 17:39 | |
|
Jack Wade, файл, с которым пробуете 9 пункт.
0
|
|
|
68 / 41 / 14
Регистрация: 24.02.2013
Сообщений: 250
|
||||||
| 14.12.2013, 17:44 [ТС] | ||||||
|
programina, тем более *data=это не массив(у меня). Размерность массива = *size, *data - простая переменная, временная, для того, чтобы организовать переход к след. числу(строке) массива в файле при помощи функции fscanf и цикла while(!feof(file))(ибо, других способов я не знаю... был бы рад узнать, есть ли возможность узнать кол-ство строк и без этих операций...), а сам массив находится в *mas. После того, как я узнаю размерность *size, я делаю след. действие:
alsav22, файл-обычный *.txt, в котором хранится массив чисел. Каждое число-хранится с новой строки. Всё это дело выглядит примерно след. образом: Кликните здесь для просмотра всего текста
6 4 9 4 2 43 29 31 543 1 0 5
0
|
||||||
|
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
||||||
| 14.12.2013, 17:56 | ||||||
|
После подсчёта количества чисел в файле, temp нужно вернуть нулевое значение (ведь после подсчёта там какое-то число останется, а дальше в коде temp используется как индекс массива):
1
|
||||||
|
68 / 41 / 14
Регистрация: 24.02.2013
Сообщений: 250
|
|
| 14.12.2013, 18:03 [ТС] | |
|
alsav22, это всё я делал... Не знаю конечно, в чём было дело, но сейчас-переписав код 9-й операции-программа прочла файл, но с двумя НО:
1 - когда я пытаюсь прочитать файл именно по пути file_way=возникает ошибка обращения к адресу(именно та, которая и была ранее у меня) 2 - если же, задать путь к файлу по умолчанию-то в конце выдаст компилятор след. ошибку(при запуске самой программы в debug): Кликните здесь для просмотра всего текста
Debug Assertion Failed! Programm:... File: ff\dd\vctools\crt_bld\self_x86\crt\src\d bgdel.cpp Line: 52 Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts. (Press Retry to debug the application) Добавлено через 35 секунд Собственно-сам код: Кликните здесь для просмотра всего текста
printf("Введите путь для загрузки файла\nПример пути = C:\\\\file.txt\n"); _gettchar(); gets(file_way); printf("Вы ввели след. путь = %s\n", file_way); system("pause"); system("cls"); if (finish_file=fopen("D:\\file.txt", "r")) { printf("Вы ввели след. путь для загрузки файла = %s\n", file_way); int* size=new int; int* data=new int; (*size)=0; (*data)=0; while(!feof(finish_file)) { fscanf(finish_file, "%d", &(*data)); printf("data = %d\n", (*data)); _gettch(); (*size)++; printf("size = %d\n", (*size)); _gettch(); } rewind(finish_file); (*data)=0; int* mas=new int[(*size)]; while(!feof(finish_file)) { fscanf(finish_file, "%d", &mas[(*data)++]); } printf("Был загружен след. массив, с размерностью в %d-чисел\n", (*size)); for (int i=0; i<(*size); i++) { printf("[%3d] = %3d\n", i+1, mas[i]); _gettch(); } delete[] mas; delete size; delete data; } else printf("Ошибка чтения файла!\n");
0
|
|
|
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
| 14.12.2013, 18:06 | |
|
0
|
|
|
68 / 41 / 14
Регистрация: 24.02.2013
Сообщений: 250
|
|||||||||||
| 14.12.2013, 20:37 [ТС] | |||||||||||
|
Всё! По идеи-разобрался...
Кликните здесь для просмотра всего текста
Большое спасибо всем, кто помог! Ошибки были следующие: В 1-м случае-я просто очищал каждый раз указатель *file_way, при заходе в главное меню программы(при возвращении к вводу в *sel) 2 - всё оказалось куда легче-просто, я случайно, удалил (*size)++ в цикле while(!feof(finish_file)), ради которой и делался этот цикл... Просто, у меня там были строки, которые отображали текущее состояние переменных (*data)(указателей точнее) и (*size)(для просмотра того, что с ними происходит). И, я просто удаливши эти строчки, удалил и строку нарастания (*size)++... Итоговый код программы(без 10-й функции): Кликните здесь для просмотра всего текста
Как ещё, кроме двойного прохода по файлу, можно получить кол-ство строк в файле? Добавлено через 4 минуты P.S. В начале, delete[] file_way я добавил для решения 2-й ошибки... Только это мне и помогло... Если сказать честно-почему помогло, я сказать однозначно не могу... P.S. 2 Кликните здесь для просмотра всего текста
Добавлено через 8 минут alsav22, и в правду-не обнулял... Но это уже то и не важно... В любом случае-моя ошибка... И ещё кое что... Я Ваш вопрос не игнорировал... Но, если это Вас так сильно обидело-то вот... И прошу прощения(если есть за что)... В начале я в коде указал обнуление переменной *temp... Посмотрите ещё раз, внимательнее...
0
|
|||||||||||
| 14.12.2013, 20:48 | ||||
|
Не по теме:
0
|
||||
| 14.12.2013, 20:48 | |
|
Помогаю со студенческими работами здесь
14
Ввод из файла размеров динамического массива Сохранение и чтение динамического массива из файла Ошибка считывания из файла динамического массива структур
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Рецензия / Мнение
Это мой обзор планшета X220 с точки зрения школьника.
Недавно я решила попытаться уменьшить свой. . .
|
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|