我有一个 istream,我必须将其读入缓冲区。一旦遇到 eof,我找不到一种方法来找出 read_len 吗?我无法使用 get,因为我的文件没有分隔符。
似乎唯一的选择就是逐个字符地阅读它,这真的是唯一的选择吗?
char buffer[128];
while(is.good()) {
is.read(buffer, sizeof(buffer));
size_t read_len = sizeof(buffer);
if (is.eof()) {
read_len = xxxx;
}
process(buffer, read_len);
}
Run Code Online (Sandbox Code Playgroud) 头文件
#ifndef IREADER_H
#define IREADER_H
#include <iostream>
class iReader {
public:
iReader();
iReader(istream *input);
iReader(const iReader& orig);
virtual ~iReader();
private:
Pixel *pixelData;
char *cData;
istream *input;
};
#endif /* IREADER_H */
Run Code Online (Sandbox Code Playgroud)
.cpp文件
#include <iostream>
#include <fstream>
#include "Pixel.h"
#include "iReader.h"
iReader::iReader() {
}
iReader::iReader(istream *input){
}
iReader::iReader(const iReader& orig) {
}
iReader::~iReader() {
}
Run Code Online (Sandbox Code Playgroud)
(对不起,如果我没有正确复制代码)
所以这是我的代码.我正在创建一个新对象,我只是能够传入一个istream指针,并且有一个istream指针变量.它在netbeans中出错,说"无法解析标识符istream".它在我的主文件中工作正常,但不在此对象中.
如果IPv4有问题并且我想从std :: istream中提取IP和ICMP头,首先我得到最初的20个字节,然后检查IPv4头中提供的头长度是否大于20个字节以便提取任何选项.下一个字节是ICMP数据包.使用IPv4标头内携带的标头长度值,我可以看到IP标头的预期大小.
但是如何获得IPv6标头的确切大小?IPv6标头内部有一个有效负载值,包括标头扩展的大小以及更高级别的数据,如ICMP.我需要知道IPv6头的大小,包括头扩展但没有更高级别的数据,以便知道ICMPv6头在std :: istream中的起始位置.
谢谢!
我看一下这个例子,关于istream get从文件流中提取字符的方法.
基本上,我不希望我的程序读取一个空行,但它跳到下一行并给出一个错误,它无法读取下一行 - 当它真的不应该读取空白行.
无论如何,这是我遵循的教程http://www.cplusplus.com/reference/istream/istream/get/这是我的代码
is.get(c)
if(c == '\0')
{
cout << "Blank line" << endl;
}
else
{
is.getline(...);
}
ignore whitespace...
is.getline(...);
Run Code Online (Sandbox Code Playgroud) 我有一些文件类型为"文件"我的意思是代替"资源\ sample.txt",他们的名字是"资源\样本"现在我想用c ++读取它们并将它们存储在一个字符串中.这是我的代码:
std::stringstream textBuffer;
std::fstream fileHandle;
std::string content
fileHandle.open("Resource\sample", std::ios::in);
textBuffer << fileHandle.rdbuf();
content = textBuffer.str();
fileHandle.close();
Run Code Online (Sandbox Code Playgroud)
但是当我编译它时,"content"变量的值等于"".帮助我.提前致谢.请注意,唯一的问题是文件没有任何扩展名,例如.txt或.dat或.bin.
我有以下代码:
std::istream is;
// ... stream initialization ...
while(is)
{
uint32_t next4Bytes = 0;
is.read(reinterpret_cast<char*>(&next4Bytes), 4);
if(next4Bytes == 218893066)
{
is.seekg(-4, std::ios_base::cur);
break;
}
else
is.seekg(-3, std::ios_base::cur);
}
Run Code Online (Sandbox Code Playgroud)
有没有比reinterpret_cast<char*>从4个字节读std::istream入更好的方法uint32_t?(显然不是c式演员)
我有一小段代码来读取用户数据,如下所示:
#include<iostream>
#include<vector>
#include<algorithm>
#include<ios>
#include<iomanip>
#include<string>
using namespace std;
istream& read_dt(istream& in, vector<int>& nmbr) {
if(in) {
nmbr.clear();
int x;
while(in >> x) {
nmbr.push_back(x);
}
if(in.fail()) {
string s;
in >> s;
in.clear();
}
}
return in;
}
int main() {
vector<int> data;
cout << "Enter all the data: " << endl;
read_dt(cin, data);
cout << "Size: " << data.size() << endl;
}
Run Code Online (Sandbox Code Playgroud)
当我使用以下数据编译并执行上述程序时:1 2 3 4 rt 5 6 7
我似乎得到了一个大小为4而不是大小为7的向量.我在上面实现的是,当用户将无效输入作为数据(在这种情况下为'r'和't')时,该数据被丢弃并且输入被清除(使用in.clear()),其余输入被"推"到矢量数据中.
但这似乎并没有发生.我究竟做错了什么?有人可以帮忙吗?
谢谢.
有什么方法可以告诉字符串流忽略空终止字符并读取一定数量的字符吗?
正如您从这个最小示例中看到的,即使 char 数组由 3 个字符组成,字符串流也会在第二个位置终止:
#include <sstream>
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
char test[3];
test[0] = '1';
test[1] = '\0';
test[2] = '2';
stringstream ss(test);
char c;
cout << "start" << endl;
while (ss.get(c)) {
cout << c << endl;
}
if (ss.eof()) {
cout << "eof" << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
$ ./a.out
start
1
eof
Run Code Online (Sandbox Code Playgroud) 假设您有std::array<int, SIZE> a,并且您已将 的每个元素保存a到一个文件中,在一行中用空格分隔。然后你想用via读取它们std:istream& is:
is >> std::skipws >> a[0] >> a[1] >> a[2] >> ... >> a[SIZE-1];
Run Code Online (Sandbox Code Playgroud)
对于 的任何值,如何通用地编写此代码SIZE。尽管还有其他简单的方法可以做到这一点,但我很好奇如何使用这种特定方法来完成它。
我正在尝试创建一个使用有理数字并对它们执行运算符重载的类.我在程序的一部分,即输入流上遇到问题.
例如,我应该以"12/8"格式输入,它应该将12存储到变量a中,然后将8存储到变量b中.
这是我的代码:
istream& operator>>( istream& In, Rational& Item )
{
char division_sign;
int a,b;
In >> a >> division_sign;
if (division_sign != '/' || !In.good())
{
In.setstate( ios::failbit );
}
else
{
In >> b;
if (b != 0 || !In.good())
{
return Item.numerator_ = a, Item.denominator_ = b;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我收到的错误:
In function 'std::istream& operator>>(std::istream&, Rational&)':
131: error: invalid initialization of reference of type 'std::istream&' from expression of type 'int'
Run Code Online (Sandbox Code Playgroud)
Line 131是return声明
有什么方法可以转换ifstream成一个istream?我有一个函数调用getToken(istream* br),接受一个istream作为参数,但在我main()使用an ifstream来读取文件,我必须使用它ifstream来调用getToken.我怎样才能克服这个问题?