| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > из Pchar в string |
| Автор: Vladimir1988 7.2.2010, 11:58 | ||
| Подскажите пожалуйста как перевести из Pchar в string Вот часть кода:
|
| Автор: Keeper89 7.2.2010, 14:33 |
StrPas(F) или string(F). Только зачем это здесь? |
| Автор: CodeMonkey 7.2.2010, 14:36 |
| PChar-а не увидел. У вас файл читается в строку F. Строчка p2.Read(PChar(F)^, Length); - это эквивалент p2.Read(Pointer(F)^, Length); или p2.Read(F[1], Length); Никакой PChar строки тут нет. Есть String. А вот логика вашего цикла странна. Что у вас в этом текстовом файле и что вы хотите оттуда прочитать? |
| Автор: Vladimir1988 7.2.2010, 14:36 | ||
| Мне необходимо из потока записать в массив. Добавлено через 1 минуту и 54 секунды в текстовом файле находятся положительные и отрицательные числа и их обязательно через поток надо записать в массив Добавлено через 7 минут и 7 секунд Что то получилось, только выходит сообщение (см вложение)
|
| Автор: CodeMonkey 7.2.2010, 22:34 | ||
[вырезано цензурой].... а КАК они там записаны, мы должны угадать? Через пробел-ли, каждое число - с новой строки, или табуляцией или ещё как. |
| Автор: Vladimir1988 7.2.2010, 22:39 | ||
| Вот код всей программы. В первой процедуре в файл через поток записываются данные из массива. Во второй процедуре данные необходимо считать, и тут возникают различного рода ошибки...
|
| Автор: CodeMonkey 7.2.2010, 22:40 | ||
Совет: отформатируйте код и вы увидите проблему:
Добавлено через 3 минуты Ага, значит у вас записано по числу на строчку. Тогда уточнение: вам принципиально использование TFileStream? Загрузка через TStringList была бы проще. |
| Автор: Vladimir1988 8.2.2010, 11:02 |
| Принципиально использование потока. |
| Автор: CodeMonkey 8.2.2010, 11:32 |
| Тогда нормальный вариант будет: 1. Считать весь файл за раз в строку. 2. Сделать while-цикл по строке. Условие цикла - пока в строке есть #13#10 (разделитель строк). 3. Каждая итерация цикла отрезает от прочитанной строки подстроку до очередного #13#10 и заносит в массив. Пункт 1 у вас уже выполнен. Только почему он сидит в цикле - загадка. Пункт 2 реализуется циклом while, вам также понадобится функция Pos, чтобы узнать позицию #13#10 в F. Пункт 3 реализуется функциями Copy и (опционально) Delete для "откусывания" подстроки. Готовый код я принципиально не хочу вам давать. http://transl-gunsmoker.blogspot.com/2009/08/blog-post_04.html. Кусочки я вам назвал и даже сказал, как их надо соединить. Ваша задача - тупо набить код. |
| Автор: Vladimir1988 8.2.2010, 11:37 |
| Спасибо. |
| Автор: Vladimir1988 8.2.2010, 22:07 | ||
| Добрый вечер. Написал код, но в массив пишутся какие то странные числа, явно не из файла. Вот код:
|
| Автор: Rennigth 8.2.2010, 22:49 | ||
Особо ни в код ни в топик не вдавался(время поджимает), но как я понимаю сейчас у Вас первая проблемма в том что Вы не устанавливаете курсор на начало файла. На сколько помню у TFileStream есть метод Seek для этого. |
| Автор: CodeMonkey 8.2.2010, 23:22 | ||||
А точно не врёте? У вас код нерабочий. Куда (и зачем) вы убрали SetLength? Проблема №2: массив F имеет размер только 10 элементов. А если MaxElements больше 10? Впрочем, на этот вопрос можно не отвечать, т.к. на самом деле там не нужен массив. Вы вынесли чтение из файла и заполнение массива в два разных цикла. Вопрос: зачем? Объедините их в один. Откусили строку - тут же её в k загнали. Тогда и массив не понадобится, т.к. на очередной итерации мы можем откусывать в ту же переменную (на самом деле, даже переменной не надо: k[i] := StrToInt(Copy(...)); + Inc(i) и Delete).
Сразу после TFileStream.Create указатель и так стоит на начале файла, никакой Seek не нужен. Добавлено через 1 минуту и 46 секунд Ах, да, проблема №3: условие выхода из цикла никогда сработает, т.к. LE у вас в цикле не меняется. |
| Автор: Rennigth 8.2.2010, 23:25 | ||
Проверить сейчас не могу |
| Автор: CodeMonkey 8.2.2010, 23:30 |
| P.S. Для дальнейшего чтения: - http://transl-gunsmoker.blogspot.com/2009/09/blog-post.html - http://transl-gunsmoker.blogspot.com/2009/09/pchars.html |
| Автор: Vladimir1988 9.2.2010, 10:55 |
| СПС |
| Автор: Vladimir1988 9.2.2010, 11:14 | ||||
Добавлено через 4 минуты и 5 секунд Подскажите плиз почему код виснет
Добавлено через 6 минут и 10 секунд Подскажите плиз, че то виснет при запуске
|
| Автор: CodeMonkey 9.2.2010, 13:22 |
| Не знаю, как при запуске, но при нажатию на кнопку - возможно. Есть подозрение, что цикл у вас бесконечный. LE := LE-LS; - это что вообще такое? У вас поиск #13#10 выполняется один раз - до цикла. И ни разу в самом цикле. А должен! Ведь условие выхода из цикла - "пока в W не останется #13#10". Проблема №2 - в delete (W,LE,1); вы перепутали порядок аргументов. Остальное, на беглый взгляд, в порядке. |
| Автор: Vladimir1988 9.2.2010, 13:26 |
| CodeMonkey, спасибо большое. Вопрос решен. |