Reputation: 2238
I've been thinking about an easy way for a programmer to write down all ASCII characters. First I tried to print it in a console but it didn't show me all characters. So I tried to write it to a file which worked first but now doesn't.
Code :
#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;
}
The normal ASCII Table has 128 and the extend Table has 127. So together there are 255 characters. But somehow it doesn't save all characters to the file. Also sometimes "gedit" doesn't even recognize the encoding standard.
What am I doing wrong?
Upvotes: 2
Views: 17599
Reputation: 19407
For reference, see ASCII and Extended ASCII.
RE: Also sometimes "gedit" doesn't even recognize the encoding standard.
I also highly recommend The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!).
From the above article, in particular note the following which is relevant to your question:
In the ANSI standard, everybody agreed on what to do below 128, which was pretty much the same as ASCII, but there were lots of different ways to handle the characters from 128 and on up, depending on where you lived. These different systems were called code pages.
So, how the characters from 128 through 255 are portrayed in an application such as gedit
entirely depends on what code page is active. Perhaps it's one of these two:
Some popular encodings of English text are Windows-1252 (the Windows 9x standard for Western European languages) and ISO-8859-1, aka Latin-1 (also useful for any Western European language).
Also, please keep in mind that most modern applications have moved away from code pages altogether in favor of Unicode. The most commonly used encodings for Unicode are UTF-8 and UTF-16. Therefore, it is possible that gedit
supports Unicode as well. From the ASCII link above:
To allow backward compatibility, the 128 ASCII and 256 ISO-8859-1 (Latin 1) characters are assigned Unicode/UCS code points that are the same as their codes in the earlier standards. Therefore, ASCII can be considered a 7-bit encoding scheme for a very small subset of Unicode/UCS, and ASCII (when prefixed with 0 as the eighth bit) is valid UTF-8.
Upvotes: 2
Reputation: 42082
This code will show you the printable characters:
#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;
}
Output:
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 ~
Upvotes: 3
Reputation: 788
Not all characters are printable. You could use isprint() to check if a character is printable; if not you have to print another (ex. '.') char:
file << ((isprint(i))? char(i) : '.');
Upvotes: 3
Reputation:
Not every ASCII character is in fact printable. For example, how would you expect a “carriage return” or “start of heading” to be displayed? Those characters could be displayed differently by different editors/terminals, or not displayed at all. It is not clear what exactly you are trying to do and why, but if you are looking for an ASCII table, here is one for you:
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
And if you are looking for a method to write ASCII characters in binary form, then you need to open your file in binary mode by setting std::ios_base::binary
bit in open mode.
Upvotes: 5