Форум программистов, компьютерный форум, киберфорум
Наши страницы

Функция getc (FILE*) при первом вызве считывает НЕ ПЕРВЫЙ символ файла.Почему? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Simple WinAPI framework http://www.cyberforum.ru/cpp-beginners/thread46975.html
#include "app.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR CmdLine, int ShowCmd) { Application *app = new Application(hInstance); app->Initialize(); int result...
C++ Вопрос о строках. Здравствуйте, все. Талдычу строки. #include <iostream> #include <stdio.h> using namespace std; int main() { http://www.cyberforum.ru/cpp-beginners/thread46966.html
C++ Определить, содержит ли 4-х значное число 3 одинаковые цифры.
Я сортирую, а потом сравниваю, но что то не работает :( char* mas(char* a, int s); int main(int argc, char *argv) { const int size=100; char arr; int i, k;
Выбрать и упорядочить данные из текстового файла C++
В языке С не сильна, и программа вызвала некое недоумение) Есть тестовый файл со следующими данными: 0.299 -0.410 960.20 4551.85 1.120 346.85 275.46 20.508 19.854 99.999 20.085 19.431...
C++ Координаты для вывода массива http://www.cyberforum.ru/cpp-beginners/thread46893.html
Товарищи, помогите массив вывести в координатах. Делаю так: HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE); COORD coord = {50,50}; const int y=3,x=3; int a={1,1,1,1,1,1,1,1,1}; int i, j;...
C++ От чего мы любим С++? Хочу спросить наших уважаемых гуру, как истинных специалистов в области программирования на С++ несколько давно наболевших вопросов. Я уже успел попробовать всего по чуть-чуть и мне сложно... подробнее

Показать сообщение отдельно
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,508
13.08.2009, 21:29  [ТС]
Цитата Сообщение от odip Посмотреть сообщение
Давай ты сразу целиком напиши задачу, чтобы нам не гадать.
Не, ну, так-то нет необходимости, я её решил. Мне осталось только разобраться, в том, что мне написали выше и проанализировать (щас пока некогда, не вникал ещё)

А вообще задача такая:

Дан текстовый файл slovar.txt, представляющий из себя перечень слов (английских) в алфавитном порядке. Между словами- по одному пробелу, после последнего слова EOF
Требуется "сжать" этот файл (создать другой файл *txt) по такому правилу:
Допустим, слова такие:
air almost any by fly for from gate

Первое слово копируем полностью. Потом так. Смотрим сколько букв из второго слова совпадают с буквами из первого В данном случае 1 буква 'a' пишем 1, потом most. Получается
air1lmost

Потом смотрим на слова "almost" и "any". Ага, одна буква совпадает, пишем один и остаток слова "ny", уже получится
air1lmost1ny

И так до конца. Пробелы, естествено опускаем. В условии я и алгоритм рассказал почти весь. Вот мой код. Теперь пишу "расифровыватель"

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
using namespace std;
 
 
int main () {
 
//Первое что сделаем, объявим два указателя на файл    
 FILE* pravi_ukazatel;
 FILE* levi_ukazatel;
 
//Это указатель на файл-результат
 FILE* fail_rez;
 
 //Вспомогательные переменные
 int  bukva_v_pravom__slove;
 int  bukva_v_levom__slove;
 
 //Это будет счётчик одинаковых букв
 int chotchik_odinakovih_bukv;
 
 int i= 0;
 
 
 //Откроем файл-словарь
 pravi_ukazatel= fopen ("slovar.txt", "r");
 levi_ukazatel= fopen ("slovar.txt", "r");
 
 //Откроем файл-результат, чтобы записывать в него результат.
 fail_rez= fopen ("rezultat.txt", "w");
 
 /*Прежде всего в rezultat.txt полностью считаем первое слово так, чтобы
 fail_rez указывал на следующую за этим словом позицию в файле rezultat.txt  
 */
 while ((bukva_v_pravom__slove=(getc(pravi_ukazatel)))!=32){
  fputc (bukva_v_pravom__slove, fail_rez);
 }
 
 //Это пусть будет условием продолжения цикла.Сам цикл ниже
 bukva_v_pravom__slove= 32;
 
 
 //Ну, то есть после правого слова либо пробел, либо конец файла
 //Если будет конец файла, кина не будет!
 while (bukva_v_pravom__slove== 32){
 
 //Теперь такой вот циклик. Считываем символ за символом из второго и первого слов
  chotchik_odinakovih_bukv= 0;
  while ((bukva_v_pravom__slove= getc(pravi_ukazatel))== (bukva_v_levom__slove= getc(levi_ukazatel))) {
   //Не забываем инкриминировать счётчик
   chotchik_odinakovih_bukv++;
 
  } 
 
 //Всё цикл закончился. Теперь bukva_v_pravom__slove> bukva_v_levom
 //Теперь запишем количество одинаковых символов в фал-результат
 //Предполагаем, что chotchik_odinakovih_bukv< 10, иначе кранты
  fputc ((chotchik_odinakovih_bukv+ 48), fail_rez);
 //Записали. Ноль, так ноль или чего там.
 
 
 /*Теперь символ за символом считываем правое слово, пока не наткнёмся на первый символ
 не являющийся буквой. Одновременно записываем считанные символы в файл-результат
 */
  do {
   fputc (bukva_v_pravom__slove, fail_rez); 
  }
  while (isalpha(bukva_v_pravom__slove= getc(pravi_ukazatel)));
 //Всё, теперь bukva_v_pravom__slove либо 32, либо -1 (либо пробел, либо конец файла)
 //Если пробел, продолжаемрассматривать слова, если EOF, всё на этом
 
 //Но перед этим сделаем так, чтобы и bukva_v_levom__slove== 32.
 //Тогда следующий символ, считагнный getc(levi_ukazatel) будет первой буквой следующего слова.
 //Последнее символ, считанный с помощью levi_ukazatel, находится сейчас в
 //bukva_v_levom__slove. Это либо пробел, либо буква
  while (bukva_v_levom__slove!=32)  {
   bukva_v_levom__slove= getc(levi_ukazatel);
  }
  ;
  i++;
 }
 
 return 0;
}
Добавлено через 1 минуту 42 секунды
Ребята, я напортачил с переменной i, она не нужна вообще.
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru