2013-05-31 4 views
2

Я подумываю о том, чтобы программист мог записать все символы ASCII. Сначала я попытался распечатать его в консоли, но он не показал мне всех символов. Поэтому я попытался записать его в файл, который работал сначала, но теперь нет.Запись ASCII в файл

Код:

#include <iostream> 
#include <fstream> 

using namespace std; 

int main() 
{ 
    fstream file; 
    file.open("/home/david/Desktop/ascii.txt", ios_base::out); 
    for(int i = 0; i <= 255; i++) 
     file << char(i); 
    file.close(); 
    return 0; 
} 

Нормальная Таблица ASCII имеет 128 и удлинять таблица имеет 127. Таким образом, вместе есть 255 символов. Но каким-то образом он не сохраняет всех символов в файле. Также иногда «gedit» даже не распознает стандарт кодирования.

Что я делаю неправильно?

+2

Вам нужно открыть файл в двоичном режиме. –

+0

Я бы предположил, что _is_ сохраняет все символы в файле, а ваш редактор gedit не отображает их. (И он не должен их отображать.) –

ответ

5

Не каждый символ ASCII на самом деле доступен для печати. Например, как бы вы ожидали отображения «возврата каретки» или «начала заголовка»? Эти символы могут отображаться по-разному разными редакторами/терминалами или вообще не отображаться. Не ясно, что именно Вы пытаетесь сделать и почему, но если вы ищете таблицы ASCII, here is one для вас:

 Oct Dec Hex Char      Oct Dec Hex Char 
     ------------------------------------------------------------------------ 
     000 0  00 NUL '\0'     100 64 40 @ 
     001 1  01 SOH (start of heading)  101 65 41 A 
     002 2  02 STX (start of text)   102 66 42 B 
     003 3  03 ETX (end of text)   103 67 43 C 
     004 4  04 EOT (end of transmission) 104 68 44 D 
     005 5  05 ENQ (enquiry)    105 69 45 E 
     006 6  06 ACK (acknowledge)   106 70 46 F 
     007 7  07 BEL '\a' (bell)    107 71 47 G 
     010 8  08 BS '\b' (backspace)  110 72 48 H 
     011 9  09 HT '\t' (horizontal tab) 111 73 49 I 
     012 10 0A LF '\n' (new line)   112 74 4A J 
     013 11 0B VT '\v' (vertical tab)  113 75 4B K 
     014 12 0C FF '\f' (form feed)  114 76 4C L 
     015 13 0D CR '\r' (carriage ret)  115 77 4D M 
     016 14 0E SO (shift out)    116 78 4E N 
     017 15 0F SI (shift in)    117 79 4F O 
     020 16 10 DLE (data link escape)  120 80 50 P 
     021 17 11 DC1 (device control 1)  121 81 51 Q 
     022 18 12 DC2 (device control 2)  122 82 52 R 
     023 19 13 DC3 (device control 3)  123 83 53 S 
     024 20 14 DC4 (device control 4)  124 84 54 T 
     025 21 15 NAK (negative ack.)   125 85 55 U 
     026 22 16 SYN (synchronous idle)  126 86 56 V 
     027 23 17 ETB (end of trans. blk)  127 87 57 W 
     030 24 18 CAN (cancel)    130 88 58 X 
     031 25 19 EM (end of medium)   131 89 59 Y 
     032 26 1A SUB (substitute)   132 90 5A Z 
     033 27 1B ESC (escape)    133 91 5B [ 
     034 28 1C FS (file separator)  134 92 5C \ '\\' 
     035 29 1D GS (group separator)  135 93 5D ] 
     036 30 1E RS (record separator)  136 94 5E ^
     037 31 1F US (unit separator)  137 95 5F _ 
     040 32 20 SPACE      140 96 60 ` 
     041 33 21 !       141 97 61 a 
     042 34 22 "       142 98 62 b 
     043 35 23 #       143 99 63 c 
     044 36 24 $       144 100 64 d 
     045 37 25 %       145 101 65 e 
     046 38 26 &       146 102 66 f 
     047 39 27 '       147 103 67 g 
     050 40 28 (       150 104 68 h 
     051 41 29 )       151 105 69 i 
     052 42 2A *       152 106 6A j 
     053 43 2B +       153 107 6B k 
     054 44 2C ,       154 108 6C l 

     055 45 2D -       155 109 6D m 
     056 46 2E .       156 110 6E n 
     057 47 2F /       157 111 6F o 
     060 48 30 0       160 112 70 p 
     061 49 31 1       161 113 71 q 
     062 50 32 2       162 114 72 r 
     063 51 33 3       163 115 73 s 
     064 52 34 4       164 116 74 t 
     065 53 35 5       165 117 75 u 
     066 54 36 6       166 118 76 v 
     067 55 37 7       167 119 77 w 
     070 56 38 8       170 120 78 x 
     071 57 39 9       171 121 79 y 
     072 58 3A :       172 122 7A z 
     073 59 3B ;       173 123 7B { 
     074 60 3C <       174 124 7C | 
     075 61 3D =       175 125 7D } 
     076 62 3E >       176 126 7E ~ 
     077 63 3F ?       177 127 7F DEL 

И если вы ищете метод писать ASCII-символов в двоичной форме , то вам нужно открыть файл в двоичном режиме, установив std::ios_base::binary бит в открытом режиме.

+0

У меня на столе есть таблица ASCII, но я просто хотел попробовать их распечатать: P Теперь я знаю лучше, спасибо. Я собираюсь принять этот вопрос за 7 минут. – Davlog

+0

@Davlog: Возможно, вы захотите дать другим возможность дать лучший ответ, поэтому никогда не спешите с приемлемым :) –

3

Не все символы могут быть распечатаны. Вы можете использовать isprint(), чтобы проверить, можно ли печатать символ; если нет, вам нужно напечатать другой (пример.). char:
файл < < ((isprint (i))? char (i): '.');

+0

также очень хороший ответ! Благодарю. – Davlog

2

Для справки см. ASCII и Extended ASCII.

RE: Также иногда «gedit» даже не распознает стандарт кодирования.

Я также очень рекомендую The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!).

Из приведенной выше статьи, в частности, обратите внимание на следующее, которая имеет отношение к вашему вопросу:

В стандарте ANSI, все согласились, что делать ниже 128, который был почти такой же, как ASCII , но было много разных способов обработки символов от 128 и выше, в зависимости от того, где вы жили . Эти различные системы назывались code pages.

Итак, как символы с 128 по 255 изображены в приложении, таком как gedit, полностью зависят от того, какая кодовая страница активна. Возможно, это одна из этих двух:

Некоторых популярных кодировок английского текста являются Windows-1252 (винд 9x стандарта для западноевропейских языков) и ISO-8859-1, иначе Latin-1 (также полезны для любого западноевропейского языка).

Кроме того, имейте в виду, что большинство современных приложений полностью отошли от кодовых страниц в пользу Unicode.Наиболее часто используемые кодировки для Unicode: UTF-8 и UTF-16. Следовательно, возможно, что gedit поддерживает Unicode. Из ссылки ASCII выше:

Для обратной совместимости, 128 ASCII и 256 ISO-8859-1 (Latin 1) символы присваиваются Unicode/UCS кодовых точек, которые являются же, как и их коды в более ранних стандартов. Следовательно, ASCII может быть рассмотрел 7-битную схему кодирования для очень малого подмножества Unicode/UCS, а ASCII (при префиксе с 0 как восьмой бит) имеет действительный UTF-8.

3

Этот код покажет вам печатаемые символы:

#include<iostream> 
#include<iomanip> 
#include<string> 

int main() { 
    std::cout<<std::setw(3)<<"dec " 
      <<std::setw(3)<<"oct " 
      <<std::setw(3)<<"hex " 
      <<std::setw(3)<<"chr" 
      <<std::endl; 
    for(unsigned int id=0; id<255; id++) { 
    char c = char(id); 
    if(std::isprint(c)){ 
     std::cout<<std::dec<<std::setw(3)<<id<<" " 
       <<std::oct<<std::setw(3)<<id<<" " 
       <<std::hex<<std::setw(3)<<id<<" " 
       <<std::setw(3)<<c<<std::endl; 
    } 
    } 
    return 0; 
} 

Выход:

dec oct hex chr 
32 40 20  
33 41 21 ! 
34 42 22 " 
35 43 23 # 
36 44 24 $ 
37 45 25 % 
38 46 26 & 
39 47 27 ' 
40 50 28 (
41 51 29 ) 
42 52 2a * 
43 53 2b + 
44 54 2c , 
45 55 2d - 
46 56 2e . 
47 57 2f /
48 60 30 0 
49 61 31 1 
50 62 32 2 
51 63 33 3 
52 64 34 4 
53 65 35 5 
54 66 36 6 
55 67 37 7 
56 70 38 8 
57 71 39 9 
58 72 3a : 
59 73 3b ; 
60 74 3c < 
61 75 3d = 
62 76 3e > 
63 77 3f ? 
64 100 40 @ 
65 101 41 A 
66 102 42 B 
67 103 43 C 
68 104 44 D 
69 105 45 E 
70 106 46 F 
71 107 47 G 
72 110 48 H 
73 111 49 I 
74 112 4a J 
75 113 4b K 
76 114 4c L 
77 115 4d M 
78 116 4e N 
79 117 4f O 
80 120 50 P 
81 121 51 Q 
82 122 52 R 
83 123 53 S 
84 124 54 T 
85 125 55 U 
86 126 56 V 
87 127 57 W 
88 130 58 X 
89 131 59 Y 
90 132 5a Z 
91 133 5b [ 
92 134 5c \ 
93 135 5d ] 
94 136 5e ^
95 137 5f _ 
96 140 60 ` 
97 141 61 a 
98 142 62 b 
99 143 63 c 
100 144 64 d 
101 145 65 e 
102 146 66 f 
103 147 67 g 
104 150 68 h 
105 151 69 i 
106 152 6a j 
107 153 6b k 
108 154 6c l 
109 155 6d m 
110 156 6e n 
111 157 6f o 
112 160 70 p 
113 161 71 q 
114 162 72 r 
115 163 73 s 
116 164 74 t 
117 165 75 u 
118 166 76 v 
119 167 77 w 
120 170 78 x 
121 171 79 y 
122 172 7a z 
123 173 7b { 
124 174 7c | 
125 175 7d } 
126 176 7e ~ 
Смежные вопросы