ifstream EOF 提前执行

ifstream EOF executing early

提问人:Towermoni 提问时间:5/5/2021 更新时间:5/5/2021 访问量:220

问:

我正在使用套接字编程,目前正在尝试一次通过 16KB 传输 1MB 文件。数据最初一次传输 16KB;但是,我的ifstream过早地到达EOF,这使得文件传输不完整。

int main() {

int SIZE = 16000;
char file_buffer[SIZE];
int i = 0;

ifstream my_file("1MB", ios::in | ios::binary);
if (!my_file) {
    cout << "No such file";
} else {
io_service io_service;
// socket creation
ip::tcp::socket client_socket(io_service);

client_socket
    .connect(
        tcp::endpoint(
            address::from_string("127.0.0.1"),
            9999));


while(!my_file.eof()) {
    char ch;

        my_file >> ch;
        if(my_file.eof())
        {
            cout << "File Buffer: " << file_buffer << endl;
            cout << "ERROR: EOF DETECTED" << endl;
            break;
        }
        else if (i == SIZE)
        {
            sendData(client_socket, file_buffer);
            memset(file_buffer, 0, sizeof file_buffer);
            i = 0;
        } else
        {
            file_buffer[i] = ch;
            i++;
        }
    }

}
my_file.close();
return 0;

}

C++ 套接字 TCP IFSTREAM EOF

评论

0赞 Ted Lyngmo 5/5/2021
如果文件大小不是 的精确倍数,您如何处理 ?看起来你只是放弃了它。SIZEfile_buffer
0赞 Casey 5/5/2021
小吹毛求疵:不是.由于您正在处理二进制数据,因此使用会更好、更明确。charunsigned charuint8_t
0赞 Casey 5/5/2021
此外,这是不正确的。用。while(!my_file.eof())unsigned char ch; while(my_file >> ch)

答:

0赞 Ted Lyngmo 5/5/2021 #1

如果文件大小不是 的精确倍数,则您似乎丢弃了文件末尾的数据。SIZE

此外,即使文件大小是 的精确倍数,您也会读取最后一个字符,然后不会返回 .直到您尝试读取下一个字符才会返回,这将触发您的错误消息。SIZEeof()trueeof()trueERROR: EOF DETECTED

更多内容在这里:为什么 iostream::eof() 在循环条件中(即 while (!stream.eof()))被认为是错误的?

另一种方法:

unsigned i = 0;

while(my_file >> file_buffer[i]) { // loop for as long as extracting succeeds
    if(++i == SIZE) {
        sendData(client_socket, file_buffer, i);       // add a size parameter
        // memset(file_buffer, 0, sizeof file_buffer); // why waste the time?
        i = 0;
    }
}

if(i) sendData(client_socket, file_buffer, i); // send the last part in the buffer