Writing ASCII to file

14,151

Solution 1

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   ~

Solution 2

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) : '.');

Solution 3

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.

Share:
14,151
Davlog
Author by

Davlog

Learning PHP, HTML, C / C++, Python.

Updated on June 04, 2022

Comments

  • Davlog
    Davlog over 1 year

    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?