private void sendMessage(String message, int relaisId, long timestamp) {
try {
if (connCount > 50) {
s = new Socket(ip, port); //RUN NORMALLY: java.net.ConnectException: Connection refused: connect
connCount=0;
}
outputStream = s.getOutputStream();
outputStream.write(message.getBytes());
outputStream.write(new byte[]{0});//DEBUG: java.net.SocketException: Connection reset by peer: socket write error
outputStream.flush();
connCount++;
} catch (UnknownHostException ex) {
logger.error("Host not found: " + ip + ":" + port, ex);
connCount=51;
retryMessage(message, relaisId, timestamp);// basically sleep 3s then call sendMessage
} catch (IOException ex) {
logger.error("Error at Relais No. " + relaisId + ": " + ip + ":" + port, ex);
connCount=51;
retryMessage(message, relaisId, timestamp); // basically sleep 3s then call sendMessage
} finally {
try {
if (connCount > 50 && s != null) {
s.close();
}
} catch (IOException ex) {
logger.error("IOException", ex);
}
}
}
当我使用 ifstream 中的 somefile.txt 阅读时,使用 anotherfile.txt > ofstream ,一切正常,但假设我注释掉#include<iostream>
#include<fstream>
#include<string>
#include<vector>
using namespace std;
int main(){
ofstream out;
ifstream in;
out.open("The Necessary Death of Charlie Countryman2.srt");
if (out.fail()) {
perror("The Necessary Death of Charlie Countryman2.srt");
}
in.open("The Necessary Death of Charlie Countryman.srt");
if (in.fail()) {
perror("The Necessary Death of Charlie Countryman.srt");
}
vector<string> input;
string inc;
while (getline(in, inc)) {
input.push_back(inc);
}
for (int k = 0; k < input.size(); k++) {
out << input[k] << endl;
}
return 0;
}
并执行代码,没有错误,当我打开 anotherfile.txt 它是空的。
我的问题是在
期间out.open("anotherfile.txt")
会发生什么?
发送给for (int k = 0; k < input.size(); k++) {
out << input[k] << endl;
}
的地点或内容是什么?如果它是 cout ,则进入命令提示符,如果input[k]
未被注释,则转到anotherfile.txt。
答案 0 :(得分:2)
每个<<
操作都会失败,就是这样(那是(1)所有这一切。)
(1)可以将流设置为在失败时抛出异常的模式,但这不是默认值。默认情况下,默认会忽略失败。除了设置了失败状态位之外,您可以使用fail()
或转换为bool
来检查。
功能
答案 1 :(得分:2)
我假设out
被声明为ostream
(或ofstream
之类的子类)。当您注释掉out.open(...)
行时,out
会被初始化为已关闭的文件。因此,当您尝试写入时,没有任何反应,并且注入失败......但您无法测试它是否成功!
如果您使用以下方法进行测试:
for (int k = 0; k < input.size(); k++) {
out << input[k] << endl;
if out.fail() {
// process error condition...
}
}
你会传入错误条件分支,并且能够知道注入没有发生。
答案 2 :(得分:2)
ofstream
使用此operator<<
签名
basic_ostream& operator<<( std::basic_streambuf<CharT, Traits>* sb);
来自cpppreference,operator<<
,8)
构造并检查sentry对象后,检查sb是否为空指针。如果是,则执行setstate(badbit)并退出。
您可以通过
轻松检查#include <iostream>
#include <fstream>
int main()
{
std::ofstream sink;
//sink.open("/dev/null");
sink << "check state";
switch(sink.rdstate())
{
case std::ios_base::failbit:
std::cout << "stream state is failbit\n";
break;
case std::ios_base::goodbit:
std::cout << "stream state is goodbit\n";
break;
case std::ios_base::eofbit:
std::cout << "stream state is eofbit\n";
break;
case std::ios_base::badbit:
std::cout << "stream state is badbit\n";
break;
default:
break;
}
return 0;
}
Prints:流状态为badbit
答案 3 :(得分:1)
out
是std::ostream
类型的对象,同样std::cout
是一个类型为std::ostream
的对象,它位于全局命名空间中(它在您的开头可用)程序)。
类型为std::ostream
的对象(输出流,包括像std::ofstream
一样扩展它的子类),它们的<<
运算符被重载。
cout<<"hello";
这种方式与std::cout.operator<<("Hello World");
请注意,重载的<<
运算符会返回对ostream
对象的引用,因此cout<<"hi" << " there";
基本上是
std::cout.operator<<("hi").operator<<(" there"));
在写入之前,您需要打开任何输出文件流。通过这样做,您正在向操作系统调用一个系统调用,使您可以访问这些文件,以便您可以写入文件。否则,您正在尝试写入您的进程无权写入的已关闭文件。
您不必为std::cout
明确执行此操作,但您应该打开自己的输出文件流。
不要忘记关闭打开的文件!!