Forum: C++ problem

Forum huvudsida -> Programmering -> C++ problem

Sidor: 1

Till botten

Duggregn 16:33 - 14:e Augusti 2006 | Post #1
Medlem
Inlägg: 4


Skicka PM
Okej, ska försöka förklara problemet någorlunda kortfattat och tydligt.

Jag har försökt mig på att göra nån sorts krypteringsprogram. Programet läser in en char variabel i taget från en textfil och översätter sedan den till ett antal siffror, vid "dekryptering" läser programet in siffror och letar upp ett tecken som har matchande sifferkod och matar sedan ut tecknet. Två problem har dock dykt upp.

  • Programet verkar inte vilja läsa in mellanslag.

  • Andra problemet är att inmatningskön eller nåt liknande blir totalknasig om den läser in två st paranteser. resultatet från en körning där filen inehåller nåt sånt här "a(a)aaa" blir "a(a)jyjj".

Skulle vara oerört tacksam om nån kunde ge mig lite klarhet i det här. Smiley

Edit: gjorde det hela lite tydligare Smiley

-------------------------
Ingen signatur!

Senast redigerad 16:37 - 14:e Augusti 2006


Nissebosselasse 17:36 - 14:e Augusti 2006 | Post #2
Medlem
Inlägg: 490


Skicka PM
Posta källkoden också, det hjälper oss andra Smiley

-------------------------
http://pushingcows.se
Gula Nallen



Duggregn 19:11 - 14:e Augusti 2006 | Post #3
Medlem
Inlägg: 4


Skicka PM
okej, här kommer den. Komm bara ihåg att tekniken är topphemlig, planerar att sälja den för stora summor till storbanker världen över Smiley

  1.  
  2. #include <iostream>
  3. #include <windows.h>
  4. #include <ctime>
  5. #include <fstream>
  6. void krypt(char z);
  7. void decrypt(char kodis[]);
  8. using namespace std;
  9.  
  10. ofstream outFile;
  11. /*
  12. för att inte vara allt för uppenbar representeras varje tecken av fyra siffror,
  13. det första och den fjärde är själva teckenkoden,
  14. dom andra är bara där för att vara fula,
  15. en av dom räknar antalet gånger tecknet lästs in och den andra bara ett värde som du själv väljer
  16. */
  17. struct bokstav
  18. {
  19. char stav;
  20. char nr1;
  21. char nr2;
  22. int typ;
  23. int count;
  24. };
  25. struct ibokstav
  26. {
  27. char stav;
  28. int nr1;
  29. int nr2;
  30. int typ;
  31. int count;
  32. };
  33. /* hade lite problem med char / int jämförelse (troligen för att det inte är möjligt?),
  34. löste det lite provisoriskt med en utläsnings struktur och en mer för inläsning.*/
  35. bokstav ialfabetet[35] =
  36. {
  37. {'a',0,1,0},
  38. {'b',0,2,0},
  39. {'c',0,3,0},
  40. {'d',0,4,0},
  41. {'e',0,5,0},
  42. {'f',0,6,0},
  43. {'g',0,7,0},
  44. {'h',0,8,0},
  45. {'i',0,9,0},
  46. {'j',1,0,0},
  47. {'k',1,1,0},
  48. {'l',1,2,0},
  49. {'m',1,3,0},
  50. {'n',1,4,0},
  51. {'o',1,5,0},
  52. {'p',1,6,0},
  53. {'q',1,7,0},
  54. {'r',1,8,0},
  55. {'s',1,9,0},
  56. {'t',2,0,0},
  57. {'u',2,1,0},
  58. {'v',2,2,0},
  59. {'x',2,3,0},
  60. {'y',2,4,0},
  61. {'z',2,5,0},
  62. {'.',2,6,0},
  63. {'!',2,7,0},//
  64. {',',2,8,0},
  65. {'1',2,9,0},//
  66. {'"',3,0,0},//
  67. {')',3,1,0},//
  68. {'(',3,2,0}//
  69. };
  70.  
  71. bokstav alfabetet[35] =
  72. {
  73. {'a','0','1',0},
  74. {'b','0','2',0},
  75. {'c','0','3',0},
  76. {'d','0','4',0},
  77. {'e','0','5',0},
  78. {'f','0','6',0},
  79. {'g','0','7',0},
  80. {'h','0','8',0},
  81. {'i','0','9',0},
  82. {'j','1','0',0},
  83. {'k','1','1',0},
  84. {'l','1','2',0},
  85. {'m','1','3',0},
  86. {'n','1','4',0},
  87. {'o','1','5',0},
  88. {'p','1','6',0},
  89. {'q','1','7',0},
  90. {'r','1','8',0},
  91. {'s','1','9',0},
  92. {'t','2','0',0},
  93. {'u','2','1',0},
  94. {'v','2','2',0},
  95. {'x','2','3',0},
  96. {'y','2','4',0},
  97. {'z','2','5',0},
  98. {'.','2','6',0},
  99. {'!','2','7',0},
  100. {',','2','8',0},
  101. {'1','2','9',0},
  102. {'"','3','0',0},
  103. {')','3','1',0},
  104. {'(','3','2',0}
  105. };
  106.  
  107. int main()
  108. {
  109. bool meny=true;
  110. while(meny)
  111. {
  112. int val;
  113. cout << "1.kryptera" << endl << "2.dekryptera" << endl << "3.avsluta"<< endl;
  114. cin >> val;
  115. cin.get();
  116. if (val == 1)// krypterar
  117. {
  118. char filename[60];
  119. ifstream inFile;
  120. cout << "Kryptera fran: ";
  121. cin.getline(filename, 60);
  122. inFile.open(filename);
  123. if (!inFile.is_open())
  124. {
  125. cout << "Kunde inte oppna " << filename << endl;
  126. cout << "Program terminating.\n";
  127. cin.get();
  128. cin.get();
  129. exit(EXIT_FAILURE);
  130. }
  131. char filename2[60];
  132. //ofstream outFile;
  133. cout << "och till: ";
  134. cin.getline(filename2, 60);
  135. outFile.open(filename2);
  136. if (!outFile.is_open())
  137. {
  138. cout << "Kunde inte oppna " << filename2 << endl;
  139. cout << "Program terminating.\n";
  140. cin.get();
  141. cin.get();
  142. exit(EXIT_FAILURE);
  143. }
  144.  
  145. char temp;
  146. int count=0;
  147. inFile >> temp;
  148. while (inFile.good()) // while input good and not at EOF
  149. {
  150. ++count; // one more item read
  151. krypt(temp);
  152. inFile >> temp; // get next value
  153. }
  154. outFile << "~";
  155. cout << "------------" << endl << count << " tecken inlasta fran " << filename << " till " << filename2 << endl << "------------" << endl; }
  156. if(val ==2)//dekrypterar
  157. {
  158. char filename[60];
  159. ifstream inFile;
  160. cout << "Dekryptera fran: ";
  161. cin.getline(filename, 60);
  162. inFile.open(filename);
  163. if (!inFile.is_open())
  164. {
  165. cout << "Kunde inte oppna " << filename << endl;
  166. cout << "Program terminating.\n";
  167. cin.get();
  168. cin.get();
  169. exit(EXIT_FAILURE);
  170. }
  171. char filename2[60];
  172. //ofstream outFile;
  173. cout << "och till: ";
  174. cin.getline(filename2, 60);
  175. outFile.open(filename2);
  176. if (!outFile.is_open())
  177. {
  178. cout << "Kunde inte oppna " << filename2 << endl;
  179. cout << "Program terminating.\n";
  180. cin.get();
  181. cin.get();
  182. exit(EXIT_FAILURE);
  183. }
  184.  
  185. int count=0;
  186. char kodis[3];
  187. char temp;
  188. bool forsta_gang=true;
  189. inFile >> temp;
  190. if(temp=='~')
  191. break;
  192. kodis[0]=temp;
  193. while (inFile.good()) // while input good and not at EOF
  194. {
  195. if(!forsta_gang==true)
  196. {
  197. inFile >> temp;
  198. if(temp=='~')
  199. break;
  200. kodis[0]=temp;
  201. }
  202. else
  203. forsta_gang=false;
  204. inFile >> temp;
  205. if(temp=='~')
  206. break;
  207. kodis[1]=temp;
  208. inFile >> temp;
  209. if(temp=='~')
  210. break;
  211. kodis[2]=temp;
  212. inFile >> temp;
  213. if(temp=='~')
  214. break;
  215. kodis[3]=temp;
  216. ++count; // one more item read
  217. decrypt(kodis);
  218. }
  219. cout << "------------" << endl << count << " tecken dekrypterade fran " << filename << " till " << filename2 << endl << "------------" << endl;
  220. }
  221. if(val == 3)//avsluta
  222. meny=false;
  223. outFile.close();
  224. }// while loop slut
  225. return 0;
  226. }
  227.  
  228. void krypt(char z)
  229. {
  230. for(int t=0;t < 100;t++)
  231. {
  232. if (ialfabetet[t].stav == z)
  233. {
  234. int kod[3];
  235. kod[0]=ialfabetet[t].nr1;
  236. kod[1]=ialfabetet[t].typ;
  237. kod[2]=ialfabetet[t].count;
  238. kod[3]=ialfabetet[t].nr2;
  239. ialfabetet[t].count =+ 1;
  240. outFile << kod[0] << kod[1] << kod[2] << kod[3];
  241. }
  242. }
  243.  
  244. }
  245.  
  246. void decrypt(char kodis[])
  247. {
  248. for(int t=0;t < 100;t++)
  249. {
  250. if(alfabetet[t].nr1 == kodis[0] && alfabetet[t].nr2 == kodis[3])
  251. {
  252. //cout << alfabetet[t].stav;
  253. outFile << alfabetet[t].stav;
  254. }
  255. }
  256. }


-------------------------
Ingen signatur!



Nissebosselasse 11:57 - 15:e Augusti 2006 | Post #4
Medlem
Inlägg: 490


Skicka PM
Det där med mellanslag ligger i hur textströmmarna behandlas: det finns en flagga som heter skipws (skip whitespace), som bestämmer huruvida strömmen ignorerar "vita" tecken (mellanslag, tabb, radbrytning). Den är på som standard, men kan stängas av med unsetf:
  1.  
  2. std::ifstream in;
  3. in.unsetf (std::ios::skipws);
  4.  
  5. // För att slå på flaggan igen, används
  6. // setf
  7. in.setf (std::ios::skipws);

Fler flaggor hittar du här:
http://www.cppreference.com/io_flags.html#format_flags

Problemet med paranteserna har jag inte kollat närmare på, det är kanske ett fel i din krypteringsmetod, och inte i själva inmatningen?

-------------------------
http://pushingcows.se
Gula Nallen



Sidor: 1

Forum huvudsida -> Programmering -> C++ problem
Atom feed

Du får inte posta i den här tråden | Till toppen