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

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

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

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

Ответ
 
Опции темы
Старый 03.01.2007, 12: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, 22:52   #2
fresh
 
Регистрация: 04.01.2007
Сообщений: 3
По умолчанию

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

а если так написать: if (&st1==&st2) ... тогда по идеи всё норм должно быть?
zetrix вне форума   Ответить с цитированием
Старый 05.01.2007, 12: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 в 12:55.
Umen вне форума   Ответить с цитированием
Старый 05.01.2007, 21: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 в 21:29.
fresh вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


11:46.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.