【问题标题】:Writing ASCII to file将 ASCII 写入文件
【发布时间】:2013-05-31 20:13:55
【问题描述】:

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

我做错了什么?

【问题讨论】:

  • 需要以二进制方式打开文件。
  • 我猜它正在将所有字符保存到文件中,而您的编辑器“gedit”没有显示它们。 (而且它不应该全部显示。)

标签: c++ ascii fstream


【解决方案1】:

并非每个 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 位来以二进制模式打开文件。

【讨论】:

  • 我的桌子上有一个 ASCII 表,但我只是想尝试打印它们 :P 但现在我知道得更好了,谢谢。我会在 7 分钟内接受这个问题。
  • @Davlog:你可能想给别人一个提供更好答案的机会,所以不要急于接受:)
【解决方案2】:

并非所有字符都是可打印的。您可以使用 isprint() 检查字符是否可打印;如果不是,您必须打印另一个(例如“。”)字符:
文件

【讨论】:

    【解决方案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   ~
    

    【讨论】:

      【解决方案4】:

      有关参考,请参阅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 (拉丁语 1)字符被分配 Unicode/UCS 代码点,它们是 与早期标准中的代码相同。因此,ASCII 可以 考虑了一个非常小的子集的 7 位编码方案 Unicode/UCS 和 ASCII(以 0 作为第八位前缀时)是 有效的 UTF-8。

      【讨论】:

        猜你喜欢
        • 2014-04-04
        • 2015-02-20
        • 1970-01-01
        • 2014-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-12
        • 2013-12-07
        相关资源
        最近更新 更多