C++ 我是否必须使用ifstream查找每次读取?
这是我从任何大小的文件中读取的循环,每次写入1016字节的char*数据包1016字节,然后发送它(发送尚未包括在内) 有必要使用seekg()吗?或者reading是否已经将指针移动到下一个块的前面C++ 我是否必须使用ifstream查找每次读取?,c++,file-io,binaryfiles,C++,File Io,Binaryfiles,这是我从任何大小的文件中读取的循环,每次写入1016字节的char*数据包1016字节,然后发送它(发送尚未包括在内) 有必要使用seekg()吗?或者reading是否已经将指针移动到下一个块的前面 ifstream file (packet.message, ios::in|ios::binary|ios::ate); if(file.is_open()) { size = file.tellg(); file.seekg(0, ios::beg); for(int
ifstream file (packet.message, ios::in|ios::binary|ios::ate);
if(file.is_open()) {
size = file.tellg();
file.seekg(0, ios::beg);
for(int i = 0; !ios::eof; i++) {
memset(packet.message,0,1016*sizeof(char));
file.read(packet.message,1016*sizeof(char));
file.seekg(i*1016*sizeof(char));
}
}
我知道这不是写入文件的问题,因为您只需一直写入到文件的末尾,直到文件大小合适为止
编辑:在if语句中添加整个代码位。这不是必需的。从上次看到文件指针的位置继续读取,与写入操作完全相同。我敢打赌,文件没有在
std::ios_base::binary
模式下打开,并且memset()
和seekg()都没有打开
用于掩盖结果的影响:虽然如果文件读取了部分记录,可能需要清除文件末尾的尾随字节,但两者都不需要
顺便说一句:您总是希望在读取后检查流的状态:
while (in.read(buffer, size)) {
...
}
另外:
sizeof(char)==1
谢谢,我想这现在可以变成一个while循环了@Portaljacker-您可能也不需要在循环之前搜索。@Robᵩ 我之所以把它放在这里,是因为在这个例子中,它向我们展示了。在使用tellg()保存大小之前,我没有显示该行。我假设tellg()移动了指针。tellg()
没有移动指针,但听起来好像你有一个先前的seekg()
。在这种情况下,您可能需要重新设置到开始位置。@Robᵩ 我从中得到它的例子很奇怪…它和我在例子中做的一样,tellg然后seekg到0。它说tellg给出了指针的当前位置,如果指针在文件的末尾,它的大小是多少?有问题的教程:你知道,你总是可以编译代码,运行它,看看它是否符合你的要求。还有很多其他的事情要做。我必须单独做一个程序,你说这好像是创建一个C++程序是困难的。我几乎每次编写C++程序时都会编写、编译和运行一个小程序(主要是因为我不经常使用C++,而且我不想发布代码编译的代码示例)。1)使用<代码> EOF()<代码>作为循环条件。2)<代码> .Ef()/Cuth>是一个调用函数,不是一个要测试的标志。在某些情况下,@ Brand AddioToad建议,但是在C和C++中,它经常由于执行定义和未定义的行为而失败。你是说这是新编写的代码吗?取消对seekg()
的所有调用(您甚至不使用大小
,更不用说它可能会给您带来错误的结果,例如,如果使用了非Cstd::codevt
方面)。另外,松开memset()
:数据无论如何都会被read()
覆盖,尽管您可能希望验证您读取的数据量是否达到了预期值。。。您的循环条件显然是错误的,应该是file.read(…)
。memset用于在写入数据包之前确保数据包为0'd。尺寸用于其他用途,但其位置很重要,因为我必须在转移之前将尺寸发送到另一台机器。就像我说的,我没有放入任何网络代码,只是在那之前将内容移动到数据包中。memset()
毫无意义:除了最后一个数据包之外,所有字节都可能被read()覆盖。
!您可以在(file.read(buffer,size)){std::fill(buffer+file.gcount(),buffer+size,0);send(buffer,size);}时设置未使用gcount()写入的尾随字节。寻找文件结尾是否会给出粗略近似值的大小还没有定义。搜索结果可用于恢复位置。搜索位置的计算确实有效,但您至少需要计算结束和开始之间的差值。