22 / 22 / 8
Регистрация: 12.02.2012
Сообщений: 137
|
|
1 | |
Запись в типизированный файл по строкам17.04.2012, 17:21. Показов 6586. Ответов 18
Метки нет (Все метки)
уважаемые знатоки и просто такие же как я нубы, зашедшие сюда =)
начал изучать типизированные файлы. не могу понять как выполнить запись в типизированный фал ПО СТРОКАМ задача такова - дан файл веществ чисел, содержащий элементы прямолуг матрицы по строкам, причем первый элемент - количество столбцов. получить новый файл такой же структуры с транспонированной матрицей получить новый файл, с транспонированной матрицей. я так понимаю что файл внутри машины можно представляется как то так m 1 2 3 4 5 6 7 8 9 0 1 4 6 5 7 где m кол-во столбов.. в общем не могу представить, как это реализовать. очень прошу - НЕ кидать готовое решение. очень хочу это понять сам и разобраться. пока мысли такие - как то записывать в файл каждую строку и добавлять в конец каждой элементы с кодами #13#10 а при считывании в программу, добавить ее в некую матрицу, потом из которой перезалить в новый файл. Динамические массивы не использовали и не проходили - следовательно ими пользоваться нельзя. в общем помогите разобраться...
0
|
17.04.2012, 17:21 | |
Ответы с готовыми решениями:
18
Запись в типизированный файл Запись в типизированный файл Запись в типизированный файл Запись в типизированный файл |
132 / 129 / 31
Регистрация: 12.12.2011
Сообщений: 462
|
|
17.04.2012, 17:41 | 2 |
У Вас файл ТИПИЗИРОВАННЫЙ, а не текстовый! Зачем #10?..
Как в программе хранится сам массив? Array of Array? Если вы указываете Type A = Array of Double; То записать переменную этого типа в файл функцией Write не получится, поскольку не известна длинна массива. Писать в файл можно только в случае если Type A = Array[0..100] of Double; А если длинна массива не известна, то сначала в файл записывать размерность (n,m:Integer), а потом в цикле заносить элементы используя SizeOf(Тип), читать также, сдвигаясь на нужное число байт. Еще про типизированные файлы можно почитать тут: http://delphi-faq.zoxt.net/b74.htm
1
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
||||||
17.04.2012, 17:44 | 3 | |||||
Сообщение было отмечено Памирыч как решение
Решение
Зная количество элементов в столбце можно прочитать данные из файла и правильно записать их в двумерный массив.
Этот код ниже, я сейчас подправлю... ... Исправлено (но не проверено в работе):
1
|
22 / 22 / 8
Регистрация: 12.02.2012
Сообщений: 137
|
||||||
17.04.2012, 17:51 [ТС] | 4 | |||||
в программе он не хранится.
нам дается типизированный файл, в котором находятся элементы массива Добавлено через 5 минут Mawrat,
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
17.04.2012, 18:03 | 5 |
Так я же там написал - что этот код я буду ещё править.
--- Я подправил код. Но в работе его пока не проверял.
0
|
22 / 22 / 8
Регистрация: 12.02.2012
Сообщений: 137
|
|
17.04.2012, 18:11 [ТС] | 6 |
ну вообще чужие мысли немного прояснили мне алгоритм.
думаю делать так - сначала пользователь вводит кол-во элементов, потом они рандомно задаются, массив сделаю статический, 100 на 100, потому что мы не проходили динамические - а нам и скажут тогда делать без них. потом определяю длинну файла - т.е. кол-во элементов. считываю первый элемент и колво-во всех элементов делю на коло столбцов - тем самым я определю, массив каких размеров мне нужно создать. ну а дальше как получится =) Добавлено через 43 секунды Mawrat, спасибо конечно, но
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
||||||
17.04.2012, 18:25 | 7 | |||||
Сообщение было отмечено Памирыч как решение
Решение
Можно и со статическим сделать. Сейчас напишу...
Со статическим массивом:
1
|
22 / 22 / 8
Регистрация: 12.02.2012
Сообщений: 137
|
|
17.04.2012, 18:26 [ТС] | 8 |
и работаем мы только в консольном режиме(((
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
17.04.2012, 18:29 | 9 |
Сейчас в консоли сделаем...
1
|
22 / 22 / 8
Регистрация: 12.02.2012
Сообщений: 137
|
||||||
17.04.2012, 18:33 [ТС] | 10 | |||||
вы уж извините - задолбал уже наверное =)
у меня вот что получилось
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
||||||
17.04.2012, 18:51 | 11 | |||||
CaH_CaHbl4, а нужно запись сделать? А я чтение пишу... Но чтение всё равно понадобится.
--- В консоли. Чтение из файла и запись в массив:
Зато в нынешнем виде сам алгоритм пригоден для чтения неизвестного количества данных. - Например, на случай, если бы у нас был не типизированный, а текстовый файл. Добавлено через 4 минуты Сейчас вот смотрю - усечение я неверно сделал. При усечении надо перепрыгивать на следующую строку, а у меня идёт чтение дальше в строке. В результате этого, если в файле строки шире, чем в массиве, то данные будут читаться в неверном порядке... --- Т. е., сейчас этот алгоритм пригоден только для случая, когда ширина таблицы в файле не превышает ширины (количества столбцов) в массиве.
1
|
22 / 22 / 8
Регистрация: 12.02.2012
Сообщений: 137
|
||||||
17.04.2012, 18:53 [ТС] | 12 | |||||
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
||||||
17.04.2012, 18:58 | 13 | |||||
Вариант с исправлениями:
Нет - количество элементов и в столбцах и строках проверяется. И выхода за границы там не будет. Защита от нарушения границ по столбцам: 63 строка в коде. Защита от нарушения границ по строкам: 66 строка.
1
|
22 / 22 / 8
Регистрация: 12.02.2012
Сообщений: 137
|
|
17.04.2012, 18:59 [ТС] | 14 |
53 и 58 строка в Вашем последнем варианте.
ведь не будет же работать коректно, у Вас он из этого цикла выйдет только тогда, когда будет достигнут конец файла. или же все будет вылетать с весельем, так как получится выход за границы массива. или я что-то не понимаю? добавил извините, не заметил что у вас там через условный оператор стоит break
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
17.04.2012, 19:02 | 15 |
53 и 58 - это проверки на конец файла. Плюс к этому, 63 и 66 строки - проверки границ массива. Т. е., учтён и размер файла и размер массива - как положено, собственно.
0
|
22 / 22 / 8
Регистрация: 12.02.2012
Сообщений: 137
|
|
17.04.2012, 19:05 [ТС] | 16 |
ну вот впринципе и начинаю немного разбираться в ситуации.
только вот смотря на ваш код - откуда вы определили колво строк? у меня за это отвечает if (kol mod m)=0 then n:=Round((kol)/m) else n:=Round((kol+1)/m); где kol это кол-во элементов в файле, а m это первый элемент файла, т.е. показывает кол-во столбиков
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
17.04.2012, 19:11 | 17 |
У меня в коде заранее количество строк не определяется. Количество строк уточняется по мере чтения из файла. Прочитали очередную строку - увеличили счётчик строк: Inc(i). И так до момента, когда достигнем конца файла или когда будет достигнута последняя строка в массиве.
Здесь можно по-разному действовать - можно так как у тебя - сразу количество строк определить.
1
|
22 / 22 / 8
Регистрация: 12.02.2012
Сообщений: 137
|
||||||
17.04.2012, 21:33 [ТС] | 18 | |||||
ну в общем то и спасибо на этом =)
теперь осталось то дело за малым, завести сначала цикл по столбцам, потом по строкам и записат ьв новый файл с транспонированной матрицей Добавлено через 2 часа 13 минут в итоге вот что у меня получилось
0
|
22 / 22 / 8
Регистрация: 12.02.2012
Сообщений: 137
|
||||||
19.04.2012, 21:35 [ТС] | 19 | |||||
Сообщение было отмечено Памирыч как решение
Решение
перепелил задачу полностью =)
когда написал код, пришла идея не использовать матрицы вообще. ибо много памяти чтобы не расходовать. понимаю - сейчас памяти много у всех. но если уж кодить, то кодить грамотно если вдруг интересно как =) суть такова, что нужно взять элемент i из f и поместить в g потом взять элемент i+m из f и поместить в g и т.д. т.е. мы как бы бегаем по столбцам матрицы из файла f и поэлементно пишем их в файл g
1
|
19.04.2012, 21:35 | |
19.04.2012, 21:35 | |
Помогаю со студенческими работами здесь
19
Запись данных в типизированный файл Запись массива в типизированный файл Запись в типизированный файл (dat) Запись в типизированный файл из текстового Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |