Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужен срочный хелп!!! База на файлах!!! работа с файлами, строками 
:(
    Опции темы
ShadoW2005
  Дата 18.6.2005, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
bel_nikita
Дата 19.6.2005, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



ShadoW2005
Код
name[n]=strcat(name[n], letter); !!!!!!!! не работает 
вообще-то нужно: strcat(&name[n], letter);
но по ходу и это не поможет. как "имя" впихнутьв char? или я чего-то не понял...

Это сообщение отредактировал(а) bel_nikita - 19.6.2005, 00:37


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
vadims
Дата 19.6.2005, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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.
PM MAIL   Вверх
ShadoW2005
Дата 19.6.2005, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 18.6.2005

Репутация: нет
Всего: нет



Цитата(vadims @ 19.6.2005, 08:41)
bel_nikita Главное в другом: вообще-то непонятно - в name ты пытаешься формировать массив всех имен строк или только имя той строки с которой работаешь.

В Name я пытаюсь запихнуть имя из n-ой строки...

Что бы name[1]="Имя с первой строки", name[2] со второй.... и т.д...
PM MAIL   Вверх
comcon1
Дата 19.6.2005, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



КГ/АМ. Дык строка, то не char, а char*. А твой массив - не массив на 50 строк, а строка на 50 символов....


--------------------
PM MAIL   Вверх
vadims
Дата 19.6.2005, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 8.6.2005

Репутация: 2
Всего: 17



Сам себе противоречишь
Цитата
В Name я пытаюсь запихнуть имя из n-ой строки...

и
Цитата
Что бы name[1]="Имя с первой строки", name[2] со второй.... и т.д...


противоположные по сути высказывания

Но я кажется понял (кстати ты мне еще раз подтвердил что пришел с Паскаля smile )

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.
PM MAIL   Вверх
Earnest
Дата 20.6.2005, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



А еще, по сути задачи, лучше из входного файла читать не по-символьно, а сразу строку, а уж ее разбивать на имена, например, функцией strtok. ИМХО, код получится более красивый и читаемый.


--------------------
...
PM   Вверх
vadims
Дата 20.6.2005, 09:21 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 8.6.2005

Репутация: 2
Всего: 17



Earnest

ИМХО: все наоборот - все же более красиво/читабельно посимвольно, а вот с точки зрения оптимизации кода - наверное наоборот


--------------------
Cpu not found ! Press any key for software emulation.
PM MAIL   Вверх
Earnest
Дата 20.6.2005, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



С точки зрения "правильной" организации кода, один блок кода (функция, модуль) должен выполнять ровно одну задачу. Т.е. отдельная функция читает строку, другая - анализирует ее, и т.д. Это более правильно и с точки зрения читабельности, и с точки зрения безопасности исключений, и сточки зрения последующей поддержки. Например, если в дальнейшем потребуется усложнить лексический разбор (появятся другие разделители...). Если пытаться все совмещять в блоке чтения, то через некоторое время там черт ногу сломит, среди всех этих if-ов...


--------------------
...
PM   Вверх
comcon1
Дата 20.6.2005, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Агу - полный респект.
Строка -> Токенайзер -> Лексич. конверсер
Посмотрите, как красиво c BOOST-ом smile smile smile smile :
Читает одну строчку потокенно и сразу конвертирует..
Код

#include<iostream>
#include<boost/tokenizer.hpp>
#include<boost/lexical_cast.hpp>
#include<cstdio>

int main() {
fstream in;
int ptr[10];
try {
in.fopen("filename", ios::in);
if (!in) throw 1;
std::string str;
std::string chr (",.[]"); //разделители
in.getline(str);
tokenizer<str, chr> tokens; //токенайзер
   int i=0;
   for (tokenizer::iterator tok_iter = tokens->begin(); tok_iter != tokens->end(); ++tok_iter) {
                          ptr[i]=lexical_cast<int>(tok_iter->data()); 
                           i++;
}

} 
catch (bad_lexical_cast &e) { 
 perror("WRONG CAST!\n");
 return(-1);
}
catch (int e) {
 perror("ERROR IN OPENING FILE!\n");
 return(-2);
}
 return 0;
}



--------------------
PM MAIL   Вверх
vadims
Дата 20.6.2005, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 8.6.2005

Репутация: 2
Всего: 17



Earnest
comcon1


Подумал - согласен.
Но все-таки для начиющих наверно проще так. Хотя не настаиваю



--------------------
Cpu not found ! Press any key for software emulation.
PM MAIL   Вверх
Earnest
Дата 20.6.2005, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Начинающему лучше сразу начинать правильно. Можно без boost и т.д., самому писать ввод и прочее, как проще, но учиться разбивать код нужно с самого начала. Это ведь почти не связано с конкретным языком программирования...


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0947 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.