Мой друг помог мне найти решение, поэтому я опубликую его здесь. Самое странное, что я попробовал на нескольких разных установках Windows 7, и это работало немного по-другому. По моему, он работает только в том случае, если я запускаю его, щелкая правой кнопкой мыши и выбирая «Запуск от имени администратора», тогда как в другой установке работает простой двойной щелчок. Это неожиданно, потому что файл hosts должен быть защищен операционной системой.
Мой друг хотел сделать это без использования каких-либо встроенных функций (просто для вызова), но я думаю, что сам вставил пару.
Этот ответ, безусловно, самый длинный, вероятно, потому что он написан хуже всего. Я посмотрю другие, прежде чем выбрать лучшее.
Вот оно:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define FILENAME "C:\\Windows\\System32\\drivers\\etc\\hosts"
//#define FILENAME "asdf.txt"
int finder(char * Old_String, char * Find_String);
char * replacer(int replace_point, char * Old_String, char * Replace_String, int find_length);
int finder(char * Old_String, char * Find_String)
{
//printf("\nOld String: \n%s \n\n\n", Old_String);
//printf("\nFind String: \n%s \n\n\n", Find_String);
int old_length = strlen(Old_String);
int find_length = strlen(Find_String);
//int replace_length = strlen(Replace_String);
if (old_length == 0) printf("Old String is empty");
if (find_length == 0) printf("Find String is empty");
//if (replace_length == 0) printf("Replace String is empty");
int replace_point = 0;
while (replace_point < old_length)
{
if ((Old_String[replace_point] == Find_String[0]) && (old_length - replace_point >= find_length))
{
int compare_point = 0;
int This_Found = 1;
while (compare_point < find_length)
{
if (Old_String[replace_point + compare_point] != Find_String[compare_point]) This_Found = 0;
compare_point ++;
}
if (This_Found == 1) break;
}
replace_point ++;
}
if (replace_point == old_length) return -1;
else return replace_point;
}
char * replacer(int replace_point, char * Old_String, char * Replace_String, int find_length)
{
int before_length = replace_point;
int old_length = strlen(Old_String);
int replace_length = strlen(Replace_String);
int after_length = old_length - before_length - find_length;
int new_length = before_length + replace_length + after_length;
char * Before_String = (char *) malloc(before_length);
char * After_String = (char *) malloc(after_length);
char * New_String = (char *) malloc(new_length);
memcpy(Before_String, Old_String, before_length);
memcpy(After_String, Old_String + before_length + find_length, after_length);
memcpy(New_String, Before_String, before_length);
memcpy(New_String + before_length, Replace_String, replace_length);
memcpy(New_String + before_length + replace_length, After_String, after_length);
return New_String;
}
int main(int argc, char* argv[])
{
char * Find_String = "#74.125.224.72 asdf.com www.asdf.com";
char * Replace_String = "74.125.224.72 asdf.com www.asdf.com";
char * New_String;
char * Output_Msg;
int find_length = strlen(Find_String);
FILE * ifp = fopen(FILENAME, "r+");
int old_string_length = 0;
while(getc(ifp) != EOF) old_string_length ++;
char * Old_String = (char *) malloc(old_string_length);
fseek(ifp, 0L, SEEK_SET);
for (int i = 0; i < old_string_length; i++) Old_String[i] = getc(ifp);
fclose(ifp);
ifp = fopen(FILENAME, "w");
int replace_point = finder(Old_String, Find_String);
if(replace_point != -1)
{
New_String = replacer(replace_point, Old_String, Replace_String, find_length);
Output_Msg = "\nSwitched to NEW VERSION (development version)\n\nIn your browser, while at www.asdf.com,\n\npress CTRL+F5 and/or F5 to refresh the page.\n\nYou may have to repeat F5 and/or CTRL+F5 several times.\n\n";
}
else if(replace_point == -1)
{
Find_String = "74.125.224.72 asdf.com www.asdf.com";
Replace_String = "#74.125.224.72 asdf.com www.asdf.com";
find_length = strlen(Find_String);
replace_point = finder(Old_String, Find_String);
New_String = replacer(replace_point, Old_String, Replace_String, find_length);
Output_Msg = "\nSwitched to OLD VERSION (production version)\n\nIn your browser, while at www.asdf.com,\n\npress CTRL+F5 and/or F5 to refresh the page.\n\nYou may have to repeat F5 and/or CTRL+F5 several times.\n\n";
}
if (New_String == NULL)
{
printf("\nError: Replace function returned NULL. Exiting... \n");
system("pause");
return 0;
}
//printf("\nNew String: \n%s \n\n\n", New_String);
fseek(ifp, 0L, SEEK_SET);
int i = 0;
while(New_String[i] != '\0')
{
putc(New_String[i], ifp);
i ++;
}
fclose(ifp);
printf(Output_Msg);
system("pause");
return 0;
}