Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我是否必须使用ifstream查找每次读取?_C++_File Io_Binaryfiles - Fatal编程技术网

C++ 我是否必须使用ifstream查找每次读取?

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

这是我从任何大小的文件中读取的循环,每次写入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 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()
的所有调用(您甚至不使用
大小
,更不用说它可能会给您带来错误的结果,例如,如果使用了非C
std::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()写入的尾随字节。寻找文件结尾是否会给出粗略近似值的大小还没有定义。搜索结果可用于恢复位置。搜索位置的计算确实有效,但您至少需要计算结束和开始之间的差值。