Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 03.01.2007, 11:02   #1
Наташа
Пользователь
 
Регистрация: 27.12.2006
Сообщений: 10
Подмигивание Задача с файлами

Даны два файла. файл 1.txt и файл 2.txt создать файл 3.txt который содержит начальные совпадающие компаненты файла 1.txt и 2.txt.
Листинг программы приведен ниже. Вопрос почему программа не понимает
fscanf(in,"%s\n",&st1);
fscanf(im,"%s\n",&st2);
if (st1==st2) fprintf(out,"%s\n",st1);
else break;
Подскажите кто знает. Пожалуйста

#include <stdio.h>
#include<conio.h>
#include<iostream.h>
#define Fname "D:/С++/495/3.txt"
#define N 5
void main()
{ char fname[20]=Fname;
char st1[10];
char st2[10];
FILE *in,*im,*out;
char n;
printf("\nsoderjimoe file%s\n",fname);
puts("-------------------");
if ((in=fopen("1.txt","rt"))==NULL) {printf("error1\n"); getch(); return;}
if ((im=fopen("2.txt","rt"))==NULL) {printf("error2\n"); getch(); return; }
if ((out=fopen("3.txt","wt"))==NULL) {printf("error3\n"); getch(); return; }
while ((!feof(in))&&(!feof(im)))
{
fscanf(in,"%s\n",&st1);
fscanf(im,"%s\n",&st2);
if (st1==st2) fprintf(out,"%s\n",st1);
else break;
}
fclose(out);
getch();
fclose(in);
getch();
fclose(im);
getch();
}
Наташа вне форума Ответить с цитированием
Старый 04.01.2007, 21:52   #2
fresh
 
Регистрация: 04.01.2007
Сообщений: 3
По умолчанию

строки в С сравниваются при помощи функции strcmp (где насколько я понимаю происходит поэлементное сравнение), а так ты просто сравнивала адреса масивов st1 и st2, а они заведомо не одинаковы (поскольку массивы разные)
fresh вне форума Ответить с цитированием
Старый 05.01.2007, 09:04   #3
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

а если так написать: if (&st1==&st2) ... тогда по идеи всё норм должно быть?
zetrix вне форума Ответить с цитированием
Старый 05.01.2007, 11:50   #4
Umen
Форумчанин
 
Аватар для Umen
 
Регистрация: 10.11.2006
Сообщений: 189
По умолчанию

Вот, немного изменил, теперь сравнивает по strcmp:

Код:
#include <stdio.h>
#include<conio.h>
#include<iostream.h>
#include<string.h>
#define Fname "D:/С++/495/3.txt"
#define N 5
void main()
{ char fname[20]=Fname;
char st1[10];
char st2[10];
FILE *in,*im,*out;
char n;
printf("\nsoderjimoe file%s\n",fname);
puts("-------------------");
if ((in=fopen("1.txt","rt"))==NULL) {printf("error1\n"); getch(); return;}
if ((im=fopen("2.txt","rt"))==NULL) {printf("error2\n"); getch(); return; }
if ((out=fopen("3.txt","wt"))==NULL) {printf("error3\n"); getch(); return; }
while ((!feof(in))&&(!feof(im)))
{
fscanf(in,"%s\n",&st1);
fscanf(im,"%s\n",&st2);
s = strcmp(st1, st2);
if (s==0) fprintf(out,"%s\n",st1);
else break;
} 
fclose(out);
getch();
fclose(in);
getch();
fclose(im);
getch();
}


Цитата:
а если так написать: if (&st1==&st2) ... тогда по идеи всё норм должно быть?
пробовал - так не прокатывает...

Последний раз редактировалось Umen; 05.01.2007 в 11:55.
Umen вне форума Ответить с цитированием
Старый 05.01.2007, 20:23   #5
fresh
 
Регистрация: 04.01.2007
Сообщений: 3
По умолчанию

if (&st1==&st2)
не будет работать поскольку происходит сравнение лиш адресов строк (тоже что и в предыдущем варианте), не будет работать даже вариант if (*st1==*st2), хотя здесь будет происходить сравнение первых символов строк.
Строки в С обязательно сравниваются поэлементно (либо циклом cамому писать или при помощи функции strcmp, что конечно предпочтительней), Umen написал что-то на подобие необходимого кода.
Хоть как по мне, если пользуетесь С++ лучше использовать std::string, там все просто: создали строку и сравниваете при помощи оператора ==.
Функция strcmp(st1, st2) возвращает -1 если st1<st2, 0 если st1==st2 и 1 если st1>st2 (сравнение строк проиходит лексиграфическое, подобно до того как слова в словаре размещаются). Поэтому при помощи функции strcmp можно даже сортировать строки.

Последний раз редактировалось fresh; 05.01.2007 в 20:29.
fresh вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задача на работу с файлами и строками MiH@N Помощь студентам 8 23.06.2008 23:44
Проблемы с Ini-файлами Азазель Общие вопросы Delphi 6 08.09.2007 18:24
Задача с текстовыми файлами SpeedMaster Паскаль, Turbo Pascal, PascalABC.NET 4 02.04.2007 14:43


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS