Какие гарантии существуют при чередовании чтения и записи?

При работе с C ++ std :: iostream (например, std :: fstream или std :: stringstream , Гарантирует ли стандарт что-либо о взаимосвязи между чтением и записью, выполняемыми в одном потоке? То есть обязательно ли верно, что если я записываю данные в std :: fstream , а затем пытаюсь прочитать данные из этого потока, я должен увидеть записанные мной данные? Как насчет std :: stringstream ? В качестве примера, гарантированно ли это сработает?

std::stringstream myStream;
myStream << "137 Hello 2.71828";

int myInt;
std::string myString;
double myDouble;

myStream >> myInt >> myString >> myDouble; // Parse as expected?

Или как насчет этого случая?

std::fstream myStream("some-file.txt", ios::in | ios::out);
myStream << "137 Hello 2.71828";

int myInt;
std::string myString;
double myDouble;

myStream >> myInt >> myString >> myDouble; // Parse as expected?

Я спрашиваю, потому что недавно разработал класс сетевого потока, в котором операции чтения и записи не влияют друг на друга (поскольку чтение извлекается из сеть и пишет отправку по сети). То есть запись

myNetworkStream << "Hi there!" << endl;

записывает по сети, а

myNetworkStream >> myValue;

читает из сети. Я не уверен, что такое поведение согласуется с общим контрактом на потоки. Если бы мне пришлось угадывать, вероятно, выполняется одно из следующих трех:

  1. Контракт iostream ничего не говорит о чередовании чтения и записи, или
  2. В целом контракт iostream ничего не говорит о чередовании чтения и записи, но есть определенные положения в спецификация, определяющая, как работают стандартные типы, такие как fstream и stringstream , или
  3. Контракт iostream действительно говорит что-то о чередующемся чтении и записи, что делает мой класс сетевого потока нарушает.

У меня есть копия спецификации, но раздел о потоках настолько сложен и загадочен, что его почти невозможно понять. Если бы кто-нибудь мог прояснить, как именно iostream должны вести себя при смешивании операций чтения и записи, я был бы очень признателен. @Path ("/ датчики / {sensorid} / версия") @Consumes ({MediaType.APPLICATION_XML, MediaType.TEXT_XML}) @Produces ({MediaType.APPLICATION_XML, MediaType.TEXT_XML}) ...

Я хочу сделать что-то вроде этого:

@Stateless
@Path("/sensors/{sensorid}/version")
@Consumes({MediaType.APPLICATION_XML, MediaType.TEXT_XML})
@Produces({MediaType.APPLICATION_XML, MediaType.TEXT_XML})
public class SensorVersionRestView extends VersionRestView{

    @PathParam("sensorid")
    private String sensorid;

    @GET
    @Path("count")
     // so the complete path is i.e. 
     // domain.com/rs/sensors/111211/version/count
    public void getCount() {

        // do something with the sensorId....

    }
}

Но единственное, что я получаю, это null во время выполнения (я использую Glassfish v3 с Джерси). Компилятор и eclipse никогда не упоминают о проблеме с @PathParam в переменной класса-члена.

Что не так с моей конструкцией?

Основная проблема в том, почему я не хочу использовать весь путь к каждому методу в этом классе, что существует другой класс, который обрабатывает некоторые операции отдыха на уровне датчика (deomain.com/rs/sensors/count, т.е.)

6
задан Matt Ball 22 April 2013 в 22:08
поделиться