C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
TStringList, Еба..ый TStringList
_NIK_
Отправлено: 10.03.2006, 19:49


Дежурный стрелочник

Группа: Участник
Сообщений: 55



В чем проблема или это глюк?Такой код
CODE

TStringList *myList = new TStringList
myList->LoadFromFile("test.txt");
myList->BeginUpdate();
for (int i = 0; i < myList->count(); i++)
 {
    myList->operator [] (i).insert("testString",1);
 }
myList->EndUpdate();
myList->SaveToFile("test.txt");

Почему файл остается темже??? ohmy.gif ohmy.gif ohmy.gif
Gal
Отправлено: 10.03.2006, 20:16


Станционный диспетчер

Группа: Участник
Сообщений: 124



Надеюсь файл "test.txt" в текущей директории?
и почему
CODE

myList->operator [] (i).insert("testString",1);

Я бы сделал так
CODE

myList->Insert(i, "testString");
_NIK_
Отправлено: 12.03.2006, 00:47


Дежурный стрелочник

Группа: Участник
Сообщений: 55



QUOTE (Gal @ 10/03/2006, 20:16)
Надеюсь файл "test.txt" в текущей директории?
и почему
CODE

myList->operator [] (i).insert("testString",1);

Я бы сделал так
CODE

myList->Insert(i, "testString");

1. Файлу приписывается точный путь начиная с диска C:
2. Именно начиная с позиции 1, а не i вставляется строка "testString".Может быть наоборот — в топике писал по памяти(в смысле поменять параметры местами).
Все равно он НЕ МЕНЯЕТСЯ!!! ohmy.gif sad.gif

Отредактировано _NIK_ — 12/03/2006, 00:51
xTrim
Отправлено: 12.03.2006, 20:13


Машинист паровоза

Группа: Участник
Сообщений: 208



вот примерно так, не зная цели операций точнее не сделаешь.
CODE

TStringList *myList = new TStringList();
myList->LoadFromFile("test.txt");
int t = myList->Count;  // иначе в цикле Count будет меняться и зациклит программу
for (int i = 0; i < t; i++)
{
myList->Insert(1,"testString"+IntToStr(i)); // вставка элемента в 1 позицию списка, НЕ в нулевую
}
myList->SaveToFile("test.txt");
delete myList; // не забывай удалять то что создал!

теперь посмотрим почему не изменялось ничего:

myList->operator [] (i) — то-же что и myList[i] — возвращает значение i-того элемента списка.
т.е. то что ты написал равносильно этому:
CODE

AnsiString temp_ = myList[i];
temp_.Insert("testString",1);

вставили в 1 позицию "testString" и благополучно забыли эту переменную.
cool.gif так что, учиться, учиться и учиться!
_NIK_
Отправлено: 12.03.2006, 22:54


Дежурный стрелочник

Группа: Участник
Сообщений: 55



QUOTE (xTrim @ 12/03/2006, 20:13)
вот примерно так, не зная цели операций точнее не сделаешь.
CODE

TStringList *myList = new TStringList();
myList->LoadFromFile("test.txt");
int t = myList->Count;  // иначе в цикле Count будет меняться и зациклит программу
for (int i = 0; i < t; i++)
{
myList->Insert(1,"testString"+IntToStr(i)); // вставка элемента в 1 позицию списка, НЕ в нулевую
}
myList->SaveToFile("test.txt");
delete myList; // не забывай удалять то что создал!

теперь посмотрим почему не изменялось ничего:

myList->operator [] (i) — то-же что и myList[i] — возвращает значение i-того элемента списка.
т.е. то что ты написал равносильно этому:
CODE

AnsiString temp_ = myList[i];
temp_.Insert("testString",1);

вставили в 1 позицию "testString" и благополучно забыли эту переменную.
cool.gif так что, учиться, учиться и учиться!

1. Дык между myList->operator [] (i) и myList[i] нет никакой разницы.
2. А почему это myList->Count меняется, ведь при myList->Insert(1,"testString") увеличивается размер только той строки кот. меняешь общее кол-во строк ведь не меняется. Почему надо так for (int i = 0; i < t; i++), а не так myList->Count, странно ты знаешь?
3. И через temp_.Insert("testString",1) тож пробовал — к ней добавляет, но после myList->operator [] (i) = temp_, все равно myList->operator [] (i) не меняется!
Grigoriy
Отправлено: 12.03.2006, 23:28


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (_NIK_ @ 12/03/2006, 22:54)

2. А почему это myList->Count меняется, ведь при myList->Insert(1,"testString") увеличивается размер только той строки кот. меняешь общее кол-во строк ведь не меняется.

А какой тогда функцией можно было бы вставить строку в список строк ?

QUOTE

Почему надо так for (int i = 0; i < t; i++), а не так myList->Count, странно ты знаешь?


Потому что нужно ещё раз внимательно почитать сообщение от xTrim.

QUOTE

3. И через temp_.Insert("testString",1) тож пробовал — к ней добавляет, но после myList->operator [] (i) = temp_, все равно myList->operator [] (i) не меняется!


Попробуй так
myList->Strings[i]=temp_.
_NIK_
Отправлено: 16.03.2006, 23:46


Дежурный стрелочник

Группа: Участник
Сообщений: 55



QUOTE (Grigoriy @ 12/03/2006, 23:28)
QUOTE (_NIK_ @ 12/03/2006, 22:54)

2. А почему это myList->Count меняется, ведь при myList->Insert(1,"testString") увеличивается размер только той строки кот. меняешь общее кол-во строк ведь не меняется.

А какой тогда функцией можно было бы вставить строку в список строк ?

QUOTE

Почему надо так for (int i = 0; i < t; i++), а не так myList->Count, странно ты знаешь?


Потому что нужно ещё раз внимательно почитать сообщение от xTrim.

QUOTE

3. И через temp_.Insert("testString",1) тож пробовал — к ней добавляет, но после myList->operator [] (i) = temp_, все равно myList->operator [] (i) не меняется!


Попробуй так
myList->Strings[i]=temp_.

1. Строка вставляется так — myList->Add(%AnsiString%) — добавляет новую строку в существующий список, myList->Insert(pos,"testString") — вставляет строку "testString" в позицию pos, при этом он вставляет в эту позицию, а не заменяет.
2. Еще раз прочитал...не пойму. Ты наваерно думаешь, я не учел перед этим int t = myList->Count, дык я это упустил — и так понятно.
3. Попробую...
_NIK_
Отправлено: 16.03.2006, 23:53


Дежурный стрелочник

Группа: Участник
Сообщений: 55



2 Grigoriy: myList->Strings[i]=temp_ — РАБОТАЕТ!!!
И SaveToFile тож заработал!
Только вот не понятно почему же не работало myList->operator [] (i)???
wink.gif wink.gif wink.gif

Отредактировано _NIK_ — 16/03/2006, 23:55

Вернуться в Вопросы программирования в C++Builder