Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Не работает


Автор: Elfet 18.5.2003, 10:05
void Tf::mo(char m[30])
{
char fname[30] = "text.txt\0";
FILE *in;
if((in = fopen(fname, "rt")) == NULL)
{
return;
}
char name[30];
while(!feof(in)){
fscanf(in, "%s %d %d", &name, &yd, &la);
if(m == name){ fclose(in); return; };
}
fclose(in);
}

Нужно чтоб он сравнил m c name и вышел из функции
а он не сравнивает!
так и продолжает цыкл до конца файла.
Как сделать чтоб он смог найти нужное и выйти,?

Автор: DENNN 18.5.2003, 14:24
m и name у тебя объявлены как массивы char, поэтому поэтому выражение вида m означат ссылку на первый элемент массива. Поэтому сравниваются не строки, а значения ссылок.

Автор: DarkDS 19.5.2003, 12:30
Дополнение к предидушему smile.gif
if(m == name)
нужно заменить на
if(strcmp(m, name) == 0 )

Автор: RAN 19.5.2003, 17:33
Кроме того, так для общего развития, строка в кавычках уже подрузумевает ноль в конце и если содержимое массива fname - константа, то можно и даже нужно писать fname[] = "text.txt", а если не константа, то сначала описывают массив, а потом копируют в него значения (char fname[30]; strcpy(fname, "text.txt");)
return не надо заключать в {}.

Автор: DENNN 19.5.2003, 19:06
Цитата
константа, то можно и даже нужно писать fname[] = "text.txt",

Цитата
return не надо заключать в {}.

Это стиль программирования, а не обязательное требование. К вопросу не относится smile.gif

Автор: HexoGenus 19.5.2003, 20:33
char fname[30] = "text.txt\0";
Это не стиль программирования а излишний код smile.gif ноль действительно не нужен при использовании кавычек
char fname[30] = "text.txt";
и почему 30? от балды?
если размер не меняется то как сказал RAN лучше
char fname[] = "text.txt";
или потом возможно содержимое fname поменяется? тогда лучше
char fname[MAX_PATH] = "text.txt";
(лишние символы автоматом инициилизируются нулями)

а стиль smile.gif
не очень то красиво...
где вы тут стиль увидели...
программа то после исправления будет работать но стиля оформления тут и близко нет...

одна команда пишется в три строки
if((in = fopen(fname, "rt")) == NULL)
{
return;
}
а две команды в одну smile.gif
if(m == name){ fclose(in); return; };
да еще и ; после фигурных скобок smile.gif
лучше бы эти два куска оформить наоборот

Я все это говорю не к тому что хочу человека обидеть...
сам и учу и учусь smile.gif а к тому что стиль оформления становится привычкой и если на него не обращать внимания то со временем себя будет трудно переламывать...
(к примеру у меня почти полное отсутствие запятых)

Автор: DENNN 19.5.2003, 20:49
Цитата
char fname[MAX_PATH] = "text.txt";
(лишние символы автоматом инициилизируются нулями)

Это в начале, а в процессе перезаписи в этот буфер более короткой строки уже не все smile.gif


Цитата
char fname[30] = "text.txt";
и почему 30? от балды?

Потому что, возможно в дальнейшем требуется буфер именно такого размера smile.gif Гипотетически предполагая, мы же не знаем что дальше в коде происжодит?

Цитата
или потом возможно содержимое fname поменяется? тогда лучше
char fname[MAX_PATH] = "text.txt";

Ай-ай smile.gif а ведь только что товарища попрекал:
Цитата
Это не стиль программирования а излишний код

Автор: DENNN 19.5.2003, 20:52
Другими словами, рассуждение о стиле - это больше во флейм, а если уж попрекать другого, то хотя бы себе при этом не противоречить.
Без обид. Ничего лишнего. Просто человек конкретный вопрос задал, а вы ему уже все кости перемыли smile.gif

Автор: Fantasist 19.5.2003, 23:00
Поддержу HexoGenus. Все взаимосвязанно: если у человека в коде бардак, то это показывает небрежный подход к написанию программы, а это уже весьма существенное качество.

Автор: TimPP 23.5.2003, 11:59
Ни чего страшного, пару раз на грабли наступит типа:

Цитата

if(m == name){ fclose(in); return; };


... в этой строчке нельзя поставить BreakPoint на выполнение условия.

И все встанет на свои места.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)