Сначала я отвечу на вопрос, который вы на самом деле задали: memcmp - хороший способ сравнить два буфера. Некоторые предостережения:
- Вы также должны убедиться, что размер буфера не меньше размера целевой строки
- memcmp возвращает 0, если два буфера совпадают, что может быть нелогичным.
Так, например, если вы хотите увидеть, равен ли буфер строке "rwxw", вы можете написать
if (readresult >= strlen("rwxw") && !memcmp(buffer, "rwxw", strlen("rwxw"))) {
// buffer match occurred!
}
Лично я бы использовал символ "#define" или const, чтобы гарантировать, что три места, где появляется эта строка, на самом деле - одна и та же строка. Например:
#define MATCH_STRING "rwxw"
if (readresult >= strlen(MATCH_STRING) && !memcmp(buffer, MATCH_STRING, strlen(MATCH_STRING))) {
// buffer match occurred!
}
Однако есть несколько других проблем с вашим кодом. Во-первых, вам нужен цикл, который непрерывно читает из входного файла и записывает из выходного файла, пока ввод не будет исчерпан. Например, по линии
while (true) {
readResult = fread(buffer, 20, 1, readfile);
if (readResult == 0) {
// end of file
break;
}
// put your check for the "rwxr" string here!
writeResult = fwrite(buffer, readResult, 1, writefile);
if (writeResult != readREsult) {
printf("error\n");
}
}
Наконец, у вас есть то, что можно назвать «стилистической» ошибкой. В вашей программе есть два случая: указанное имя файла и имя файла по умолчанию. Эти два случая имеют много общего кода, но вы сделали вырезку и вставку. Это делает код более трудным для понимания и более подверженным ошибкам, если он будет изменен в будущем. Если вы вырезаете и вставляете код, вы делаете что-то не так! Рассмотрим вместо этого что-то вроде этого, которое максимизирует пути общего кода:
char *outFileName;
if (argc == 3) {
outFileName = argv[2];
} else {
outFileName = "prog1.out";
}
writefile = fopen(outFileName, "w");
if (!writefile) {
printf("Unable to open file %s.\n", writeFileName);
exit(1);
}