![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| Vladimir1988 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 2.12.2009 Репутация: нет Всего: нет |
Подскажите пожалуйста как перевести из Pchar в string
Вот часть кода:
|
|||
|
||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 9 Всего: 58 |
StrPas(F) или string(F). Только зачем это здесь? Это сообщение отредактировал(а) Keeper89 - 7.2.2010, 14:35 |
|||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
PChar-а не увидел. У вас файл читается в строку F. Строчка p2.Read(PChar(F)^, Length); - это эквивалент p2.Read(Pointer(F)^, Length); или p2.Read(F[1], Length); Никакой PChar строки тут нет. Есть String.
А вот логика вашего цикла странна. Что у вас в этом текстовом файле и что вы хотите оттуда прочитать? -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| Vladimir1988 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 2.12.2009 Репутация: нет Всего: нет |
Мне необходимо из потока записать в массив.
Добавлено через 1 минуту и 54 секунды в текстовом файле находятся положительные и отрицательные числа и их обязательно через поток надо записать в массив Добавлено через 7 минут и 7 секунд Что то получилось, только выходит сообщение (см вложение)
Присоединённый файл ( Кол-во скачиваний: 7 )
__________.JPG 153,42 Kb |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
То ли лыжи не едут, то ли весь файл за 1 раз считывается в переменную f. Потом, (на следующих витках цикла) соответственно, читается в нее мусор. Да и что делать со всем файлом сразу в строке - я не представляю, но уж точно StrToчто-нибудь будет выдавать ошибки хотя бы из-за размера строки. Это сообщение отредактировал(а) kami - 7.2.2010, 15:41 |
|||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
[вырезано цензурой].... а КАК они там записаны, мы должны угадать? Через пробел-ли, каждое число - с новой строки, или табуляцией или ещё как. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| Vladimir1988 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 2.12.2009 Репутация: нет Всего: нет |
Вот код всей программы.
В первой процедуре в файл через поток записываются данные из массива. Во второй процедуре данные необходимо считать, и тут возникают различного рода ошибки...
|
|||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Совет: отформатируйте код и вы увидите проблему:
Добавлено через 3 минуты Ага, значит у вас записано по числу на строчку. Тогда уточнение: вам принципиально использование TFileStream? Загрузка через TStringList была бы проще. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| Vladimir1988 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 2.12.2009 Репутация: нет Всего: нет |
Принципиально использование потока.
|
|||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Тогда нормальный вариант будет:
1. Считать весь файл за раз в строку. 2. Сделать while-цикл по строке. Условие цикла - пока в строке есть #13#10 (разделитель строк). 3. Каждая итерация цикла отрезает от прочитанной строки подстроку до очередного #13#10 и заносит в массив. Пункт 1 у вас уже выполнен. Только почему он сидит в цикле - загадка. Пункт 2 реализуется циклом while, вам также понадобится функция Pos, чтобы узнать позицию #13#10 в F. Пункт 3 реализуется функциями Copy и (опционально) Delete для "откусывания" подстроки. Готовый код я принципиально не хочу вам давать. Программирование означает, что иногда вам нужно сложить вместе несколько частей. Кусочки я вам назвал и даже сказал, как их надо соединить. Ваша задача - тупо набить код. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| Vladimir1988 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 2.12.2009 Репутация: нет Всего: нет |
Спасибо.
|
|||
|
||||
| Vladimir1988 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 2.12.2009 Репутация: нет Всего: нет |
Добрый вечер. Написал код, но в массив пишутся какие то странные числа, явно не из файла.
Вот код:
|
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 15 Всего: 76 |
Особо ни в код ни в топик не вдавался(время поджимает), но как я понимаю сейчас у Вас первая проблемма в том что Вы не устанавливаете курсор на начало файла. На сколько помню у TFileStream есть метод Seek для этого. -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| CodeMonkey |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
А точно не врёте? У вас код нерабочий. Куда (и зачем) вы убрали SetLength? Проблема №2: массив F имеет размер только 10 элементов. А если MaxElements больше 10? Впрочем, на этот вопрос можно не отвечать, т.к. на самом деле там не нужен массив. Вы вынесли чтение из файла и заполнение массива в два разных цикла. Вопрос: зачем? Объедините их в один. Откусили строку - тут же её в k загнали. Тогда и массив не понадобится, т.к. на очередной итерации мы можем откусывать в ту же переменную (на самом деле, даже переменной не надо: k[i] := StrToInt(Copy(...)); + Inc(i) и Delete).
Сразу после TFileStream.Create указатель и так стоит на начале файла, никакой Seek не нужен. Добавлено через 1 минуту и 46 секунд Ах, да, проблема №3: условие выхода из цикла никогда сработает, т.к. LE у вас в цикле не меняется. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
||||
|
|||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 15 Всего: 76 |
Проверить сейчас не могу -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| Vladimir1988 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 2.12.2009 Репутация: нет Всего: нет |
СПС
Это сообщение отредактировал(а) Vladimir1988 - 9.2.2010, 11:16 |
|||
|
||||
| Vladimir1988 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 2.12.2009 Репутация: нет Всего: нет |
Добавлено через 4 минуты и 5 секунд Подскажите плиз почему код виснет
Добавлено через 6 минут и 10 секунд Подскажите плиз, че то виснет при запуске
Это сообщение отредактировал(а) Vladimir1988 - 9.2.2010, 11:15 |
||||
|
|||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Не знаю, как при запуске, но при нажатию на кнопку - возможно. Есть подозрение, что цикл у вас бесконечный.
LE := LE-LS; - это что вообще такое? У вас поиск #13#10 выполняется один раз - до цикла. И ни разу в самом цикле. А должен! Ведь условие выхода из цикла - "пока в W не останется #13#10". Проблема №2 - в delete (W,LE,1); вы перепутали порядок аргументов. Остальное, на беглый взгляд, в порядке. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| Vladimir1988 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 2.12.2009 Репутация: нет Всего: нет |
CodeMonkey, спасибо большое.
Вопрос решен. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |