Nobi Опубликовано 25 сентября, 2023 Поделиться Опубликовано 25 сентября, 2023 (изменено) Знатоки, помогите вот этот мой велосипед переписать на C/C++ и чтобы максимально быстро работал. Ну там буфер какой прикрутить. Global $x = 0, $y = 0, $hFile1 = 0, $hFile2 = 0 $hFile1 = FileOpen($CmdLine[2], $FO_BINARY) $hFile2 = FileOpen($CmdLine[3], $FO_BINARY) For $i = 1 To $CmdLine[1] If FileRead($hFile1, 1) == FileRead($hFile2, 1) Then $x += 1 Else $y += 1 EndIf Next FileClose($hFile1) FileClose($hFile2) ConsoleWrite($x & @CRLF & $y & @CRLF) Exit На C оно както так будет, но я сомневаюсь что это быстрый и правильный вариант #include <stdio.h> int main(int argc, char *argv[]) { int i = 0, x = 0, y = 0, z = 0; FILE *fp1, *fp2; sscanf(argv[1], "%d", &x); fp1 = fopen(argv[2], "rb"); fp2 = fopen(argv[3], "rb"); for (i = 0; i < x; i++) { if (fgetc(fp1) == fgetc(fp2)) { y++; } else { z++; } } fclose(fp1); fclose(fp2); printf("%d\n%d", y, z); return 0; } Изменено 25 сентября, 2023 пользователем Nobi Ссылка на комментарий
Nobi Опубликовано 26 сентября, 2023 Автор Поделиться Опубликовано 26 сентября, 2023 (изменено) Получил вариант работающий в 20 раз быстрее, но неплохобы еще ускорить. #include <stdio.h> #include <stdlib.h> #include <malloc.h> int main(int argc, char *argv[]) { FILE *pFile1, *pFile2; if (fopen_s(&pFile1, argv[1], "rb") || fopen_s(&pFile2, argv[2], "rb") || _fseeki64(pFile1, 0, SEEK_END) || _fseeki64(pFile2, 0, SEEK_END)) { return 1; } __int64 i64FileSize1 = _ftelli64(pFile1), i64FileSize2 = _ftelli64(pFile2), i64FileSize = (i64FileSize1 < i64FileSize2 ? i64FileSize1 : i64FileSize2), i64Matches = 0, i64Mismatches = 0; if (i64FileSize1 < 0 || i64FileSize2 < 0 || i64FileSize < 0 || _fseeki64(pFile1, 0, SEEK_SET) || _fseeki64(pFile2, 0, SEEK_SET)) { return 1; } __int8 *aFile1 = malloc(i64FileSize), *aFile2 = malloc(i64FileSize); if (aFile1 == NULL || aFile2 == NULL || fread_s(aFile1, i64FileSize, 1, i64FileSize, pFile1) != i64FileSize || fread_s(aFile2, i64FileSize, 1, i64FileSize, pFile2) != i64FileSize || ferror(pFile1) || ferror(pFile2) || feof(pFile1) || feof(pFile2)) { return 1; } fclose(pFile1); fclose(pFile2); for (__int64 i = 0; i != i64FileSize; ++i) { if (aFile1[i] == aFile2[i]) { i64Matches++; } else { i64Mismatches++; } } printf_s("%I64d\n%I64d\n%I64d", i64Matches, i64Mismatches, (i64FileSize1 < i64FileSize2 ? i64FileSize2 - i64FileSize1 : i64FileSize1 - i64FileSize2)); return 0; } Изменено 26 сентября, 2023 пользователем Nobi Ссылка на комментарий
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти