用<< istream上的<<读取固定数量的字符

bso*_*dra 5 c++ iostream ifstream filereader

我在C++中尝试了一些文件阅读策略,但我遇到了这个问题.

ifstream ifsw1("c:\\trys\\str3.txt");
char ifsw1w[3];
do {
    ifsw1 >> ifsw1w;
    if (ifsw1.eof())
        break;
    cout << ifsw1w << flush << endl;
} while (1);
ifsw1.close();
Run Code Online (Sandbox Code Playgroud)

文件的内容是

firstfirst firstsecond
secondfirst secondsecond

当我看到输出时,它被打印为

 firstfirst
firstsecond
secondfirst

我期望输出类似于:

fir
stf
irs
tfi
.....

而且我看到"第二秒"还没有打印出来.我猜最后一次读取已经满足了eof并且可能没有执行cout.但第一种行为是不可理解的.

irr*_*ate 7

提取运算符没有ifsw1w变量大小的概念,并且(默认情况下)将提取字符,直到它命中空格,null或eof.这些可能存储在ifsw1w变量之后的内存位置,如果定义了其他变量,这将导致错误.

要获得所需的行为,您应该可以使用

ifsw1.width(3);
Run Code Online (Sandbox Code Playgroud)

限制要提取的字符数.

  • @irritate,比如说十六进制字符串怎么样?那假设我有`istringstream s("12AB");`我希望将它转换为两个`unsigned a,b;`变量,以便`a`等于0x12和`b` 0xAB.可能这可以通过`s >> std :: hex >> setw(2)>> a;`然后`s >> std :: hex >> setw(2)>> b`来实现.但这不起作用,因为`istream`没有合适的`setw()`操纵器.在这种情况下,`s.width(2)`也没有帮助.有没有办法限制解析符号的数量? (4认同)