Wednesday 19 July 2017

Opções Freopen Stdin Binárias


A resposta simples é não. O modo é determinado quando o objeto iostream é construído e não pode ser alterado posteriormente. Algumas implementações podem fornecer um meio de fazê-lo mais tarde, mas isso não está padronizado. Em algumas implementações, fazer um freopen no stdout pode mudar o modo, embora eu pense que formalmente, isso é proibido em C. (É implementação definida em C.) E, aparentemente, ele não funciona em sua implementação. Você é a melhor opção é descobrir como seu sistema nomeia o dispositivo de console (devosco em Unix CONS. Eu acho que, no Windows), abra-o no modo desejado e saia para ele. Respondeu 16 de abril 14 às 11: 34 Estou tentando construir um simulador de pipeline de instruções e estou tendo muitos problemas para começar. O que eu preciso fazer é ler binário do stdin e, em seguida, armazená-lo na memória de alguma forma enquanto eu manipulo os dados. Eu preciso ler em pedaços de exatamente 32 bits um após o outro. Como eu leio em pedaços de exatamente 32 bits ao mesmo tempo Em segundo lugar, como faço para armazená-lo para manipulação mais tarde, Heres o que eu tenho chegado até agora, mas examinando os pedaços binários que eu li mais, isso simplesmente não parece certo, eu não acho que estou lendo Exatamente 32 bits, como eu preciso. Como faço para ler em 32 bits de cada vez (eles são todos 1 0, sem novas linhas, etc.), e o que eu armazená-lo, é char okay EDIT: Eu sou capaz de ler o binário, mas nenhuma das respostas produz os bits Na ordem correta, eles são todos mangled up, eu suspeito endianness e problemas lendo e movendo 8 bits ao redor (1 char) de cada vez isso precisa funcionar no Windows e C. perguntou Oct 21 09 às 6:04 na verdade você pode apenas ler Ou byte por byte ou 4 bytes por chamada, porque você precisa armazenar os dados em um buffer. Uma vez que o buffer armazenou qualquer comprimento de dados, você poderia processar o buffer de 4 bytes por 4 bytes. Entretanto stdin stdout é como streamy, então byte bytete também é natural. Ao contrário do socket I O, normalmente você pode ignorar a ordem do byte no stdin etc., é claro, se você precisar. Faça o byte-order se converter. Por causa de nenhuma linha nova (por exemplo, 39n39), use ler ou fread seria melhor. Por favor pense como um fluxo. Ndash Test Oct 21 09 às 6:45 Nenhuma dessas soluções lidas no binário na ordem correta Ajuda, por favor, aproximação de prazo. Ndash rlb. usa 23 de outubro de 09 às 11:03 x 86 plataformas são pouco endian, você não pode esperar em c os bits na ordem de rigth. Ndash ntd 23 de outubro de 09 às 13:09 1 sim Muitas vezes me perguntei sobre isso. Qual é a pergunta novamente ndash Dead conta Janeiro 26 10 às 16:59 Como ler em bits binários e, em seguida, segmentar esses bits em pedaços (talvez estranhamente dimensionados), bitmasks, por exemplo. Ndash rlb. usa 26 jan 10 às 19:08 O que você precisa é freopen (). A partir da página de manual: se o nome do arquivo for um ponteiro nulo, a função freopen () deve tentar mudar o modo da transmissão para o especificado pelo modo, como se o nome do arquivo atualmente associado ao fluxo tivesse sido usado. Nesse caso, o descritor de arquivo associado ao fluxo não precisa ser fechado se a chamada para freopen () for bem-sucedida. É definido pela implementação quais mudanças de modo são permitidas (se houver) e em que circunstâncias. Basicamente, o melhor que você pode realmente fazer é o seguinte: Isso irá reabrir o stdin para ser o mesmo fluxo de entrada, mas no modo binário. No modo normal, a leitura do stdin no Windows irá converter rn (newline do Windows) para o caractere único ASCII 10. O uso do modo rb desabilita essa conversão para que você possa ler corretamente em dados binários. Freopen () retorna um arquivo de arquivo, mas é o valor anterior (antes de colocá-lo no modo binário), então não use isso para nada. Depois disso, use fread () conforme mencionado. Quanto às suas preocupações, no entanto, você pode não estar lendo em 32 bits, mas se você usar fread () você estará lendo em 4 caracteres (o que é o melhor que você pode fazer em C-char é garantido para ser pelo menos 8 bits Mas algumas plataformas históricas e embutidas possuem caracteres de 16 bits (alguns têm 18 ou pior)). Se você usa fgets (), você nunca lerá em 4 bytes. Você lerá em pelo menos 3 (dependendo de se uma delas for newlines), e o 4º byte será 0 porque as strings C são nul-terminated e fgets () nul-ended o que lê (como uma boa função). Obviamente, isso não é o que você quer, então você deve usar o fread (). Respondeu 21 de outubro 09 às 6:44 fgets () está tudo errado aqui. Seu objetivo é o texto ASCII legível por humanos, encerrado por caracteres de fim de linha, não dados binários, e não obtém o que você precisa. Eu fiz recentemente exatamente o que você quer usando a chamada read (). A menos que seu programa tenha fechado de forma explícita stdin, para o primeiro argumento (o descritor de arquivo), você pode usar um valor constante de 0 para stdin. Ou, se você estiver em um sistema POSIX (Linux, Mac OS X ou alguma outra variante moderna do Unix), você pode usar STDINFILENO. Respondeu Oct 21 09 às 6:20

No comments:

Post a Comment