将ASCII写入文件

时间:2013-05-31 20:13:56

标签: c++ ascii fstream

我一直在考虑让程序员写下所有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”甚至不能识别编码标准。

我做错了什么?

4 个答案:

答案 0 :(得分: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位来以二进制模式打开文件。

答案 1 :(得分:3)

并非所有字符都可打印。您可以使用isprint()来检查字符是否可打印;如果不是,你必须打印另一个(例如'。')字符:
档案&lt;&lt; ((isprint(i))?char(i):'。');

答案 2 :(得分: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   ~

答案 3 :(得分:2)

如需参考,请参阅ASCIIExtended 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

那么,在gedit这样的应用程序中如何描绘128到255之间的字符完全取决于活动的代码页。也许这是这两个中的一个:

  

一些流行的英文文本编码是Windows-1252(Windows   西欧语言的9x标准)和ISO-8859-1,又名   Latin-1(对任何西欧语言也很有用)。

此外,请记住,大多数现代应用程序已完全脱离代码页而转而使用Unicode。最常用的Unicode编码是UTF-8UTF-16。因此,gedit也可能支持Unicode。从上面的ASCII链接:

  

为了允许向后兼容,128 ASCII和256 ISO-8859-1   (Latin 1)字符被分配了Unicode / UCS代码点   与早期标准中的代码相同。因此,ASCII可以   被认为是一个非常小的子集的7位编码方案   Unicode / UCS和ASCII(当前缀为0作为第8位时)是   有效的UTF-8。