IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Проблема работы с файлами, С++ Builder
ninja
сообщение 17.11.2010 22:30
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Доброй ночи, столкнулся с такой проблемой: при записи информации в файл, кроме нужной, в файл записывается еще всякая лишняя информация. Принып такой: если в файле уже есть запись с записываемым именем ее записывать не нужно, в файл записывается только новая запись. И еще такая ошибка, когда создаю файл, при чтении этого файла функция !feof(F) как-то неверно работает, а именно в цикл все равно заходит, но поидее не должно, т.к. файл пустой. Заранее благодарен за помощь.


Объявляется структура

struct YzelName
{
TCHAR name[10];
}yz;


Считывание данных из файла



AnsiString name;
NodeName = Edit1->Text;

bool flag_new_yzel = false;
char *File_Yzel_Name;

name = "Yzelname-" + ComboBox1->Items->Strings[ComboBox1->ItemIndex]; ///
File_Yzel_Name = name.c_str();

F = fopen(File_Yzel_Name,"ab+");
fclose(F);

F=fopen(File_Yzel_Name,"rb");
int i = 0;

while (!feof(F))
{
if (feof(F))
{
break;
}
fseek(F,i*sizeof(struct YzelName),SEEK_SET);
fread(&yz,sizeof(struct YzelName),1,F);
name = yz.name;
i++;
if (yz.name == NodeName)
{
flag_new_yzel = true;
}
else
{
flag_new_yzel = false;
}
}
fclose(F);


Запись в файл

if (flag_new_yzel == false)
{
F = fopen(File_Yzel_Name,"ab+");
perevod(yz.name,NodeName);
fwrite(&yz,sizeof(struct YzelName),1,F);
fclose(F);
}


Функция perevod

void perevod(TCHAR output_str[],AnsiString input_str)
{
int i;
char *str = input_str.c_str();
for (i = 0; i <= strlen(str); i++)
{
output_str[i] = str[i];
}
output_str[i-1] = '\0';
}


Сообщение отредактировано: ninja - 17.11.2010 22:32
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 18.11.2010 2:41
Сообщение #2


Гость






Хм. Нет, пожалуй не буду переделывать на Stream-ы, тут и с FILE-ом будет несложно. Сначала - код:


bool flag_new_yzel = false;

AnsiString FileName = "Yzelname-" + ComboBox1->Items->Strings[ComboBox1->ItemIndex]; ///

// Открываем файл на дозапись, если его не было - создастся
FILE *f = fopen(FileName.c_str(), "ab+");

int i = 0;
do
{
// А теперь - самое интересное. И при перемещении и при чтении
// из файла анализируем возвращаемые значения. Если хоть в одной
// из этих функций был сбой - то внутрь мы не попадаем, а сразу
// перейдем в конец цикла на проверку feof(). И она вернет "истину"...
if( (!fseek(f, i * sizeof(struct YzelName), SEEK_SET)) &&
(fread(&yz, sizeof(struct YzelName), 1, f) == 1) )
{
Name = yz.name;
flag_new_yzel = (Name == NodeName);
if(flag_new_yzel) break; // значение уже найдено - незачем ходить дальше
i++;
}
} while(!feof(f));

if(!flag_new_yzel)
{
perevod(yz.name, NodeName); // вот это я бы изменил...
fwrite(&yz, sizeof(struct YzelName), 1, f);
}
fclose(f);


Для начала - как бы я изменил perevod(). Очень просто: инициализировал бы все символы строки нулями, а потом копировал бы из строки все содержимое, до первого нуля, что ты сейчас и делаешь. Тогда в файле не оставались бы "хвосты" от более длинных строк, при последующей записи более коротких. Это ты для себя ставишь
output_str[i-1] = '\0';
, в файле-то эти "хвосты" все равно остаются. А зачем, если можно обойтись без этого?

Еще одно: у тебя Builder 2010, значит, очень многое будет зависеть от Юникодных настроек. А ты, по-моему, путаешься в типах String/AnsiString, и зачем-то еще TCHAR притянул. А ты в курсе, что в юникодном проекте у тебя TCHAR = wchar_t? Тогда почему передаешь в perevod() вторым параметром AnsiString? Головной боли не хватает? smile.gif Обращай на подобные вещи внимание.
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.06.2025 8:03
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"