Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 58, средняя оценка - 4.90
^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,235
Завершенные тесты: 1
#1

что то вроде программки,которая проверяет Hosts и лечит - C++

29.10.2009, 19:14. Просмотров 7161. Ответов 99
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void main (){
 
int c=0;
FILE *f=fopen("C:\WINDOWS\system32\drivers\etc\hosts", "a");
 
while((c=getc(f))!=EOF){
 
    if(c!="127.0.0.1 localhost"){
        cout<<"File hosts is infected";
f = fopen("C:\WINDOWS\system32\drivers\etc\hosts", "w");
fputs("127.0.0.1 localhost", f);
    }
}
 
fclose(f);
 
}
это мой код,вот на этом месте
if(c!="127.0.0.1 localhost")
я на этом месте не знаю как поступить
надо написать код,ктороый если находит другие строки кроме заводских строк-должен удалять их...как сделать?

Добавлено через 4 минуты
вопрос некорректно задал
в файле есть некий текст,определить,если кроме этого текста есть и другие слова,то удалить весь текст и добавить
127.0.0.1 loaclhost
это мой алгоритмн
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2009, 19:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос что то вроде программки,которая проверяет Hosts и лечит (C++):

Напишите функцию, которая проверяет, отсортирован ли массив - C++
Напишите функцию, которая проверяет, отсортирован ли массив вещественных чисел по невозрастанию. Она возвращает true, если отсортирован, и...

Написать программу, которая проверяет удачливость билета - C++
Близняшки Вера,Надежда и любовь пользуются общественным транспортом,чтобы добраться до школы.Когда они расплачиваются за проезд,они...

Составить программу, которая проверяет число на четность - C++
Суть самой программы: нужно составить программу, проверяющую, что введенное число является четным или нечетным. Проблема: всегда...

Написать программу, которая проверяет, является ли год високосным - C++
Написать программу, которая проверяет, является ли год високосным. Помогите пожалуйста

Написать функцию которая проверяет на уникальность каждый номер - C++
Решите пожалуйста Добавлено через 4 минуты Написать функцию которая проверяет табельный номер студента

Нужна программа которая проверяет, является ли число простым - C++
Нужна программа которая проверяет, является ли число простым. Вводится одно число n. Формат выходных данных: Необходимо вывести ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,602
03.11.2009, 14:48 #61
МедведЪ, функция fgets удобна для считывания данных построчно. Т.к. она возвращает указатель на прочитанную строку, или NULL, можно читать файл примерно так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
 
int main(){
    char buf[BUFSIZ];
    FILE *f;
 
    if ( (f = fopen("my_file.txt", "r") == NULL )
        exit(1);
 
    while ( fgets(buf, BUFSIZ, f) ){
        /* в buf прочитанная строка из файла с завершающим '\n' */
    }
    
    fclose(f);
    exit(0);
}
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
03.11.2009, 19:53 #62
Цитата Сообщение от МедведЪ Посмотреть сообщение
3.Если удалось то каким то невооброзимым образом сравниваем строки из файла с типом чар
МедведЪ, как ты будешь сравнивать строки, если будешь считывать по символу из файла (getc'м)?
Тебе нужно сравнивать не строки, а символы. Что тебе мешает сравнить два символа?
C++
1
2
3
4
if(ch1 == ch2)
  // равны
else
  // не равны
Вот и читай по символу из файла и сравнивай с соответсвующим символом строки.
У тебя нет строк - у тебя есть символы! Сравнивай символы.
Что такое строка? Массив символов. Что тебе мешает обратится к i-му символу строки? Ничего.
Считал первый символ из файла - сравнил с первым символом из твоей строки, считал второй - сравнил со вторым, считал третий - сравнил с третьим и т.д.
Жду код.
M128K145
Эксперт С++
8286 / 3505 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
03.11.2009, 23:35 #63
Все обсуждения записи скрытого текста в файл здесь Запись скрытого текста в файл
^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,235
Завершенные тесты: 1
04.11.2009, 00:41  [ТС] #64
Цитата Сообщение от M128K145 Посмотреть сообщение
Все обсуждения записи скрытого текста в файл здесь Запись скрытого текста в файл
слава богу,на земле есть справедливость!
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
МедведЪ, как ты будешь сравнивать строки, если будешь считывать по символу из файла (getc'м)?
Тебе нужно сравнивать не строки, а символы. Что тебе мешает сравнить два символа?Код C++
1
2
3
4
if(ch1 == ch2)
// равны
else
// не равны
Вот и читай по символу из файла и сравнивай с соответсвующим символом строки.
У тебя нет строк - у тебя есть символы! Сравнивай символы.
Что такое строка? Массив символов. Что тебе мешает обратится к i-му символу строки? Ничего.
Считал первый символ из файла - сравнил с первым символом из твоей строки, считал второй - сравнил со вторым, считал третий - сравнил с третьим и т.д.
Жду код.

CyBOSSeR, я вроде если не ошибаюсь в самом начале так и сделал...дай подскажку,надо тут юзать fgets?

Добавлено через 1 минуту
C++
1
2
3
4
fgets(f, 200, char);
//c=getc(f)
if(c==char)//
else //
так ?
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.11.2009, 12:21 #65
МедведЪ, Нет не надо использовать fgets, только getc. Этого для решения достаточно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include<iostream>
#include<locale.h>
#include<stdio.h>
 
int main()
{
  setlocale(LC_ALL, "Russian");
 
  char*  = "# (C) Корпорация Майкрософт (Microsoft Corp.), 1993-1999\n
#\n
# Это образец файла HOSTS, используемый Microsoft TCP/IP для Windows.\n
#\n
# Этот файл содержит сопоставления IP-адресов именам узлов.\n
# Каждый элемент должен располагаться в отдельной строке. IP-адрес должен\n
# находиться в первом столбце, за ним должно следовать соответствующее имя.\n
# IP-адрес и имя узла должны разделяться хотя бы одним пробелом.\n
#\n
# Кроме того, в некоторых строках могут быть вставлены комментарии \n
# (такие, как эта строка), они должны следовать за именем узла и отделяться\n
# от него символом '#'.\n
#\n
# Например:\n
#\n
#      102.54.94.97     rhino.acme.com          # исходный сервер\n
#       38.25.63.10     x.acme.com              # узел клиента x\n
\n
127.0.0.1       localhost";
 
  FILE* hosts = fopen("C:\\Windows\\System32\\drivers\\etc\\hosts", "r");
 
  if(!hosts){
    std::cout << "Не удалось открыть файл hosts" << std::endl;
    return 0;
  }
 
  // Очередной символ считанный из файла
  char ch;
  // Индекс очередного символа строки standart_hosts
  int n = 0;
 
  while((ch = getc(hosts)) != EOF){
    // Здесь ты сравниваешь ch с очередным символом строки standart_hosts
    // Если не эквивалентны выводишь сообщение и перезписываешь файл
  }
 
  std::cout << "Файл hosts не модифицирован" << std::endl;
  
  return 0;
}
Просто допиши этот исходник.
^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,235
Завершенные тесты: 1
04.11.2009, 13:41  [ТС] #66
CyBOSSeR, а к чему тут индекс?Оо
разве не так
if(ch==host)//
?
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.11.2009, 14:45 #67
Цитата Сообщение от МедведЪ Посмотреть сообщение
CyBOSSeR, а к чему тут индекс?Оо
разве не так
if(ch==host)//
?
ch - это символ (char), host - указатель на файл (FILE*).
У них совершенно разный тип. Как ты себе представляешь сравнение стола с лимоном? Я - плохо. А вот стол со столом, или лимон с лимоном сравнить можно.
Тебе нужно сравнивать символы - char с char.
Индекс нужен для того, чтобы обратится к определенному символу строки. Предположим мне нужен пятый символ строки. Как его получить?
C++
1
2
char* str = "abcdef";
ch = a[4] // ch == 'e'
Вот и все, ничего сложного.
Еще раз повторяю : считал первый символ - сравнил с первым символом строки hosts_standart, считал второй - сравнил со вторым, считал третий - сравнил с третьим и т.д.
Или вот еще тебе пример:
Распечатать через пробел все символы строки "Test string";
C++
1
2
3
4
5
char* str = "Test string";
int i;
 
for(i = 0; i < strlen(str); ++i)  // strlen возвращает количество символов в строке
  cout << str[i] << " ";
Теперь понимаешь, зачем нужен индекс?
^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,235
Завершенные тесты: 1
04.11.2009, 17:01  [ТС] #68
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
if(ch==host)//
для меня тут hosts это тип чар
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Теперь понимаешь, зачем нужен индекс?
да да спасибо

Добавлено через 50 минут
у меня как то не арвильно работает цикл вот
код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <windows.h>
#include <string.h>
#include <string>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream> 
#include<locale.h>
#include<stdio.h>
 
int main()
{
  setlocale(LC_ALL, "Russian");
 
  char* str = "# (C) Корпорация Майкрософт (Microsoft Corp.), 1993-1999\n#\n# Это образец файла HOSTS, используемый Microsoft TCP/IP для Windows.\n#\n# Этот файл содержит сопоставления IP-адресов именам узлов.\n# Каждый элемент должен располагаться в отдельной строке. IP-адрес должен\n# находиться в первом столбце, за ним должно следовать соответствующее имя.\n# IP-адрес и имя узла должны разделяться хотя бы одним пробелом.\n#\n# Кроме того, в некоторых строках могут быть вставлены комментарии \n# (такие, как эта строка), они должны следовать за именем узла и отделяться\n# от него символом '#'.\n#\n# Например:\n#\n#      102.54.94.97     rhino.acme.com          # исходный сервер\n#       38.25.63.10     x.acme.com              # узел клиента x\n\n127.0.0.1       localhost";
 
 
  FILE* hosts = fopen("C:\\Windows\\System32\\drivers\\etc\\hosts", "r");
 
  if(!hosts){
    perror("Не удалось открыть файл hosts");
    return 0;
  }
 
  // Очередной символ считанный из файла
  char ch;
  // Индекс очередного символа строки standart_hosts
  int n = 0;
 
  while((ch = getc(hosts)) != EOF){
    // Здесь ты сравниваешь ch с очередным символом строки standart_hosts
    // Если не эквивалентны выводишь сообщение и перезписываешь файл
 
      
      
      
 
 
while( n < strlen(str)){
n++;    
if(ch==str[n]){
 
std::cout<<"OK";
 
 
}
else std::cout<<"no";
 
}
 
 
 
}
 
 
 
 
 
 
  system("pause");
  return 0;
}

просто выводится много раз ОК и no,пробовал и с break

Добавлено через 8 минут
C++
1
2
3
4
5
6
7
8
9
10
11
while( n < strlen(str)){
    n++;}   
 
if(ch==str[n]){
 
std::cout<<"OK";
 
break;
}
else std::cout<<"no";
break;
вот немножко поменял,теперь по одному разу выводится...но выводится NO,для проверки подключил файл где только буква а,а в условии тоже поменял на а,но все говорит что не совподают...что не так?
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.11.2009, 19:13 #69
Дело в этом цикле
C++
1
2
3
while(n < strlen(str)){
  n++;
}
"Пока n меньше длины строки увеличиваем значение n". В итоге значение n после выхода из цикла будет равно strlen(str), и n будет указывать на символ окончания строки, т.е '0'.
Для чего тебе это?
По моему дело в том, что ты не понимаешь как работает getc.
Допиши ниже представленную программу, которая должна выводить содержание файла с помощью getс.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
 
int main()
{
  FILE* file = fopen("file.txt", "r");
 
  if(!file){
    printf("File not open\n");
    return 0;
  }
 
  char ch;
 
  // Сюда вставь код, который будет считывать по символу из файла
  // и выводить их на экран
  // 
  // Использую ТОЛЬКО две функции
  // getc - для считывания очередного символа
  // printf - для вывода символа на экран
 
  return 0;
}
После этого мы немного изменим твой исходник и сравнение будет работать.
^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,235
Завершенные тесты: 1
04.11.2009, 19:20  [ТС] #70
C++
1
2
ch=getc(f);
printf(ch);
так?

Добавлено через 1 минуту
CyBOSSeR, я еще поменял код вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <windows.h>
#include <string.h>
#include <string>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream> 
#include<locale.h>
#include<stdio.h> 
int main()
{
  setlocale(LC_ALL, "Russian"); 
 char* str = "# (C) Корпорация Майкрософт (Microsoft Corp.), 1993-1999\n#\n# Это образец файла HOSTS, используемый Microsoft TCP/IP для Windows.\n#\n# Этот файл содержит сопоставления IP-адресов именам узлов.\n# Каждый элемент должен располагаться в отдельной строке. IP-адрес должен\n# находиться в первом столбце, за ним должно следовать соответствующее имя.\n# IP-адрес и имя узла должны разделяться хотя бы одним пробелом.\n#\n# Кроме того, в некоторых строках могут быть вставлены комментарии \n# (такие, как эта строка), они должны следовать за именем узла и отделяться\n# от него символом '#'.\n#\n# Например:\n#\n#      102.54.94.97     rhino.acme.com          # исходный сервер\n#       38.25.63.10     x.acme.com              # узел клиента x\n\n127.0.0.1       localhost";
  FILE* hosts = fopen("C:\\Windows\\System32\\drivers\\etc\\hosts", "r"); 
  if(!hosts){
    perror("Не удалось открыть файл hosts");
    return 0;
  } 
 char ch;
  int n = 0;
 int a=0;
ch=getc(hosts);
     a=strlen(str);
if(ch==str[a]){
std::cout<<"OK\n";
}
else if(ch!=str[a]) std::cout<<"no\n"; 
  fclose(hosts);
  system("pause");
  return 0;
}
на сколькооценишь переделку

Добавлено через 28 секунд
я вообщеудалил while
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.11.2009, 19:39 #71
Цитата Сообщение от МедведЪ Посмотреть сообщение
C++
1
2
ch=getc(f);
printf(ch);
так?
Не угадал
Ты просто считал ОДИН символ из файла и вывел его на экран. А надо вывести все содержание файла. getc считывает ОДИН символ, ОДИН, и только ОДИН. При этом переводит указатель файла на следующий символ. Если достигнут конец файла возвращает EOF
Содержание файла:
1234
Код:
C++
1
2
3
4
5
6
7
char ch;
// file - указатель на файл полученный после fopen
ch = getc(file); // ch == 1
ch = getc(file); // ch == 2
ch = getc(file); // ch == 3
ch = getc(file); // ch == 4
ch = getc(file); // ch == EOF
Перепиши свой код. Вот этот:
Цитата Сообщение от МедведЪ Посмотреть сообщение
C++
1
2
ch=getc(f);
printf(ch);
Уясни для себя что делает getc, иначе двигаться дальше не получится.

Добавлено через 2 минуты
Цитата Сообщение от МедведЪ Посмотреть сообщение
я вообщеудалил while
Без while никак.
^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,235
Завершенные тесты: 1
04.11.2009, 20:08  [ТС] #72
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Без while никак.
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Уясни для себя что делает getc, иначе двигаться дальше не получится.
а я вообще думал что getc выводит все содержание.....ну теперь как?

Добавлено через 16 минут
поменял снова вот:
C++
1
2
3
4
5
6
7
8
9
  while((ch = getc(hosts)) != EOF){   
      if(ch==str[a]){
std::cout<<"OK\n";
break;
}
      else if(ch!=str[a]) {std::cout<<"no\n";
      break;
      }
  }
но все равно ошибку находит

Добавлено через 16 секунд
точнее ошибок нет то пишет NO
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.11.2009, 20:10 #73
Цитата Сообщение от МедведЪ Посмотреть сообщение
а я вообще думал что getc выводит все содержание.....ну теперь как?
Я так и понял. getc просто возвращает очередной символ и все.
Посмотри на ее прототип:
C++
1
char getc(FILE* file)
Функция принимает указатель на файл (тип FILE*), а возвращает символ (тип char). Что такое char? Символ, ОДИН символ. Как в него можно запихнуть все содержание файла? Это невозможно.
Вернемся к задаче с выводом содержания файла.
Нам надо вывести все содержание файла на консоль. Для этого мы должны последовательно считать все символы из файла и вывести их. Продолжать мы это должны пока getc не вернет EOF. Т.е. считали с помощью getc символ, проверили что это не EOF, вывели, считали следующий, проверили, вывели и т.д.
Все просто.
Немного измени код, связанный с задачей вывода содержания файла на консоль.
Вот этот:
C++
1
2
ch=getc(f);
printf(ch);
Подсказка: надо использовать while.
^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,235
Завершенные тесты: 1
04.11.2009, 20:13  [ТС] #74
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Перепиши код, связанный с задачей вывода содержания файла на консоль.
Подсказка: надо использовать while.
да это легко у меня просто гемор с проверкой символа...щас напишу
C++
1
2
3
int c=0;
FILE *f=fopen("text.txt", "r");
while((c=getc(f))!=EOF)cout<<c;
вот
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.11.2009, 20:23 #75
Я тобой горжусь
Что конкретно тебе непонятно с проверкой?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2009, 20:23
Привет! Вот еще темы с ответами:

Написать программу которая по заданному n проверяет число на палиндром - C++
Привет! Поступил учиться на дистанционное высшее образование, получил по предмету основы программирования домашнюю работу! Вот описание: ...

Написать функцию которая проверяет кратность двух чисел - C++
Написать функцию, которая принимает два целых числа N и M, и возвращает результат истина, если N кратно M, результат ложь, если N не...

написать программу которая проверяет , находится ли конкретный символ в строке ? - C++
Если честно -не совсем понимаю, как это делать Если можно - пример программы

Написать функцию, которая проверяет, является ли переданное ей число простым? - C++
Написать функцию, которая проверяет, является ли переданное ей число простым? Число называется простым, если оно делится без остатка только...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.11.2009, 20:23
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru