![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| ShadoW2005 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 18.6.2005 Репутация: нет Всего: нет |
Всем привет!!!
У меня возникла трабла.... В файле test.txt хранятся данные типа: Имя|значение1|значение2|значение3| ... и .д..... и так несколько строк.... мне нужно вытащить эти значения как это правильно сделать??? ....я делаю так и не получается: ifstream input_file("test.txt"); // Пока не конец файла while (! input_file.eof()) { // читаем по букве char letter = input_file.get(); int n=1; // линия увеличивается на 1 когда встречаем "\n" int nextvalue = 1; // меняется на +1 когда встретит "|" char name[50]; // массив имени ... т.е. для первой строки будет name[1] для второй name[2] и т.д.. if ((letter != '|') && (letter != '\n')) { if (nextvalue == 1) { name[n]=strcat(name[n], letter); !!!!!!!! не работает cannot convert parameter 1 from 'char' to 'char *' cout<<name[n]; else { // иначе переходим к следующему значению.... nextvalue=2; } if (nextvalue == 2) { ................ } } } Буду благодарен любой помощи!!!! Это сообщение отредактировал(а) ShadoW2005 - 18.6.2005, 23:54 |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
ShadoW2005
но по ходу и это не поможет. как "имя" впихнутьв char? или я чего-то не понял... Это сообщение отредактировал(а) bel_nikita - 19.6.2005, 00:37 |
|||
|
||||
| vadims |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 8.6.2005 Репутация: 2 Всего: 17 |
bel_nikita в принципе правильно указал направление
Компилятор ругается cannot convert parameter 1 from 'char' to 'char *' тк ты действительно пытаешься 'отождествить' символ с указателем на него + пытаешься в символ впихнуть указатель. Принудить компилятор сделать это можно: name[n]=(char)strcat(&name[n], &letter); , но логически это бессмысленно Главное в другом: вообще-то непонятно - в name ты пытаешься формировать массив всех имен строк или только имя той строки с которой работаешь. Если нужны имена всех строк, то name должен выглядеть примерно так: char name[MAX_STR][50]; // MAX_STR - макс. кол-во строк strcat добавляет одну строку в конец другой, причем концы строк он определяет поиском 0-символа. Изначально в name у тебя мусор, letter вообще символ и что там за ним в сегменте данных лежит - одному аллаху известно. Вообщем а. в начале name надо инициализировать, например memset(name,0,sizeof(name)); б. из letter перед strcat'ом надо сформировать строку, например char letter_str[2]; letter_str[0] = letter; letter_str[1] = '\0'; а по хорошему есть варианты добавить символ в конец строки и без strcat, например name[n][strlen(name[n])] = letter; Небольшое замечание: Судя по всему ты перед этим занимался pascal'ем, basic'ом или еще чем В C все массивы индексируются от 0 и если ты начальными номерами строк, символов в строке, элементов в массиве и тд будешь считать 1, а не 0 - тебя впереди ждет очень много сюрпризов -------------------- Cpu not found ! Press any key for software emulation. |
|||
|
||||
| ShadoW2005 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 18.6.2005 Репутация: нет Всего: нет |
В Name я пытаюсь запихнуть имя из n-ой строки... Что бы name[1]="Имя с первой строки", name[2] со второй.... и т.д... |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
КГ/АМ. Дык строка, то не char, а char*. А твой массив - не массив на 50 строк, а строка на 50 символов....
|
|||
|
||||
| vadims |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 8.6.2005 Репутация: 2 Всего: 17 |
Сам себе противоречишь
и
противоположные по сути высказывания Но я кажется понял (кстати ты мне еще раз подтвердил что пришел с Паскаля char name[50] - это не массив из 50 строк, а массив из 50 символов, те это и есть одна строка. Cтрок как типа данных в С по сути нет Причем в C'шной строке после последнего значимого символа обязан стоять 0, те строка типа "C++" - есть массив char mas[4], где mas[0] == 'C' mas[1] == '+' mas[2] == '+' mas[3] == '\0' Если же тебе нужен массив строк, то как я уже писал char name[MAX_STR][50]; // MAX_STR - макс. кол-во строк тогда name[i] и есть i-тая строка, а на самом деле это указатель(адрес) на массив, содержащий символы i-ой строки name[i][j] - j-ый символ в i-той строке Так что изменения в коде которые я привел выше абсолютно правильны и если опять не работает, то у тебя там еще куча багов Опять напоминаю - все индексы массивов начинаются с 0 - наверняка с этим у тебя будет 'абгемахт' -------------------- Cpu not found ! Press any key for software emulation. |
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
А еще, по сути задачи, лучше из входного файла читать не по-символьно, а сразу строку, а уж ее разбивать на имена, например, функцией strtok. ИМХО, код получится более красивый и читаемый.
-------------------- ... |
|||
|
||||
| vadims |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 8.6.2005 Репутация: 2 Всего: 17 |
Earnest
ИМХО: все наоборот - все же более красиво/читабельно посимвольно, а вот с точки зрения оптимизации кода - наверное наоборот -------------------- Cpu not found ! Press any key for software emulation. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
С точки зрения "правильной" организации кода, один блок кода (функция, модуль) должен выполнять ровно одну задачу. Т.е. отдельная функция читает строку, другая - анализирует ее, и т.д. Это более правильно и с точки зрения читабельности, и с точки зрения безопасности исключений, и сточки зрения последующей поддержки. Например, если в дальнейшем потребуется усложнить лексический разбор (появятся другие разделители...). Если пытаться все совмещять в блоке чтения, то через некоторое время там черт ногу сломит, среди всех этих if-ов...
-------------------- ... |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Агу - полный респект.
Строка -> Токенайзер -> Лексич. конверсер Посмотрите, как красиво c BOOST-ом Читает одну строчку потокенно и сразу конвертирует..
|
|||
|
||||
| vadims |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 8.6.2005 Репутация: 2 Всего: 17 |
Earnest
comcon1 Подумал - согласен. Но все-таки для начиющих наверно проще так. Хотя не настаиваю -------------------- Cpu not found ! Press any key for software emulation. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Начинающему лучше сразу начинать правильно. Можно без boost и т.д., самому писать ввод и прочее, как проще, но учиться разбивать код нужно с самого начала. Это ведь почти не связано с конкретным языком программирования...
-------------------- ... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |