Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2013, 21:53   #1
SHIFT999
 
Регистрация: 19.11.2012
Сообщений: 8
Печаль Сравнение двух файлов построчно

Нужно сравнить 2 файла и вывести номер строки, где они различаются. Когда запускаю - черный экран. Приходится перезапускать. Где ошибка?

Код:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

void main()
{
int c,a;
char *files1,*files2;
char co1[100], co2[100];
FILE *f1,*f2;
clrscr();

files1="t1.txt";
files1="t2.txt";

if((f1=fopen(files1,"r"))==NULL)
{
puts("Error");
getch();
exit(1);
}

if((f2=fopen(files1,"r"))==NULL)
{
puts("Error");
getch();
exit(1);
}

while ((!feof(f1)) || (!feof(f2)))
{
do
fscanf (f1,"%c",&co1);
while (co1!="\n");
do
fscanf (f2,"%c",&co2);
while (co2!="\n");
a++;
if (co1!=co2)
printf("Files are not equal at %d string",a);
getch();
exit;
}
printf("Files are equal");
getch();
fclose (f1);
fclose (f2);
}
SHIFT999 вне форума Ответить с цитированием
Старый 12.06.2013, 22:28   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
while ((!feof(f1)) || (!feof(f2)))
Может лучше
Код:
while ((!feof(f1)) && (!feof(f2)))
Цитата:
while (co1!="\n");
А это зачем?
I'm learning to live...

Последний раз редактировалось Stilet; 12.06.2013 в 22:30.
Stilet вне форума Ответить с цитированием
Старый 12.06.2013, 22:55   #3
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А это зачем?
while (co1!="\n");
Вероятно автор хотел сказать этой строкой, что-то вроде - пока не конец строки
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 12.06.2013, 23:02   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
пока не конец строки
А-а-а я не доглядел. Он посимвольно считывает...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.06.2013, 23:03   #5
SHIFT999
 
Регистрация: 19.11.2012
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Bugrimov Посмотреть сообщение
Вероятно автор хотел сказать этой строкой, что-то вроде - пока не конец строки
точно, я же написал, что нужно сравнивать строки
SHIFT999 вне форума Ответить с цитированием
Старый 12.06.2013, 23:10   #6
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Тема звучит: сравнение файлов построчно. Так и считывайте файлы построчно (с начало 1-й затем 2-й, а потом сравните строки, например функцией strcmp(), обязательно подключить string.h) Как вариант...
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 12.06.2013, 23:25   #7
SHIFT999
 
Регистрация: 19.11.2012
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Bugrimov Посмотреть сообщение
Тема звучит: сравнение файлов построчно. Так и считывайте файлы построчно (с начало 1-й затем 2-й, а потом сравните строки, например функцией strcmp(), обязательно подключить string.h) Как вариант...
тогда как считать строку? fscanf отпадает... а в гугле уже не осталось ничего, кроме даунских веток форумов вроде моей, где нет ничего полезного
SHIFT999 вне форума Ответить с цитированием
Старый 12.06.2013, 23:27   #8
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Попробуйте этот код, не тестировал, но все таки...
Код:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>

int main()
{
	int a = 0;
	char ch_1[20], ch_2[20];
	FILE *file_1;
	FILE *file_2;

	setlocale(LC_ALL, "russian");

	if((file_1 = fopen("f1.txt","r")) == NULL)
	{	printf("Error!!!");	return 1;	}

	if((file_2 = fopen("f2.txt","r")) == NULL)
	{	printf("Error!!!");	return 1;	}


	while(!feof(file_1) && !feof(file_2))
	{
		fgets(ch_1, 20, file_1);
		fgets(ch_2, 20, file_2);
		a++;
		if (strcmp(ch_1, ch_2))
		printf("\n Строка №%d в файлах различается\n",a);
	}
	printf("\n Завершение сравнения!!!\n");
	_getch();
	fclose (file_1);
	fclose (file_2);
return 0;
}
Будут вопросы по коду, спрашивайте...
Вот видите сколько желающих помочь....
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Bugrimov; 12.06.2013 в 23:38.
Bugrimov вне форума Ответить с цитированием
Старый 12.06.2013, 23:29   #9
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

Код:
#include <stdio.h>



int  file_equal(const char* fn1, const char* fn2, 
				int* row, int* col) {
	FILE* fp1, *fp2;
	int   ch1, ch2, c, r;

	if((fp1 = fopen(fn1, "r")) == NULL)
		return 0;
	if((fp2 = fopen(fn2, "r")) == NULL) {
		fclose(fp1);
		return 0;
	}

	// подсчёт строк и символов начинается с нуля
	c = r = 0; 
	while(1) {
		ch1 = fgetc(fp1);
		ch2 = fgetc(fp2);
		if(ch1 != ch2)
			break;
		else if((ch1 == '\n') && (ch2 == '\n')) {
			++r;
			c = 0;
		} else if((ch1 == EOF) && (ch2 == EOF)) 
			return 1;
		++c;
	}
	fclose(fp1);
	fclose(fp2);

	*row = r;
	*col = c;
	return 0;
}




int  main(void) {
	int err, row, col;
	err = file_equal("file1.txt", "file2.txt", &row, &col);
	if(err & 1)
		puts("Yes cmp files.");
	else
		printf("Not cmp: rows: %d, cols: %d\n", row, col);
	return 0;
}
Nuklon вне форума Ответить с цитированием
Старый 12.06.2013, 23:37   #10
SHIFT999
 
Регистрация: 19.11.2012
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Bugrimov Посмотреть сообщение
Попробуйте этот код, не тестировал, но все таки...
Идеально, спасибо большое. Только добавить conio.h и убрать нижнюю черту перед getch() в конце и все работает.
SHIFT999 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сравнение двух файлов и формирование третьего mitinomax Microsoft Office Excel 5 11.02.2012 18:29
Сравнение двух таблиц построчно, копирование совпадений на новый лист с выделением отличий rudenko_p Microsoft Office Excel 2 21.11.2011 12:33
Работа с файлами, сравнение двух файлов. zink Паскаль, Turbo Pascal, PascalABC.NET 7 01.11.2011 08:09
Сравнение двух диапазонов и удаление совпадений ПОСТРОЧНО (доработка) pringls Microsoft Office Excel 2 26.01.2011 16:54
Сравнение двух произвольных файлов rem2010 Общие вопросы Delphi 2 03.05.2010 13:21