将二进制(非格式化)数据读std::cin入a string或a中的最简单方法是stringstream什么?
我正在寻找一些帮助从命令行管道文件(16位带符号的小端整数原始数据)到我的程序:
cat data.dat | myprogram
Run Code Online (Sandbox Code Playgroud)
然后它应该将数据转换为16位有符号整数.它适用于前12个值.第13个值是错误的,后跟零.
第二个问题是程序似乎只进入while循环一次.
我正在使用Windows + MinGW.
我的代码:
#include <iostream>
using namespace std;
#define DEFAULT_BUF_LENGTH (16 * 16384)
int main(int argc, char* argv[])
{
char buf[DEFAULT_BUF_LENGTH];
while(cin >> buf)
{
int16_t* data = (int16_t*) buf; //to int
for(int i=0;i<18;i++)
{
cout << data[i] << endl;
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
0
9621
-14633
-264
5565
-12288
9527
-7109
11710
6351
4096
-5033
5773
147
0
0
0
0
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
我试图在Win32下以二进制模式解析stdin中的数据.我的代码所做的第一件事就是在开头检查一个4byte的头:
int riff_header;
fread(&riff_header, sizeof(riff_header), 1, ifp);
// 'RIFF' = little-endian
if (riff_header != 0x46464952) {
fprintf(stderr, "wav2msu: Incorrect header: Invalid format or endianness\n");
fprintf(stderr, " Value was: 0x%x\n", riff_header);
return -1;
}
Run Code Online (Sandbox Code Playgroud)
stdin 在读取之前已经切换到二进制模式:
if (*argv[argc-1] == '-') {
fprintf(stderr, "Reading from stdin.\n");
infile = stdin;
// We need to switch stdin to binary mode, or else we run
// into problems under Windows
freopen(NULL, "rb", stdin);
}
Run Code Online (Sandbox Code Playgroud)
这段代码在Linux下工作正常,但是在Win32(特别是Windows XP)上,fread似乎只能读取单个字节,从而导致评估失败.例:
> ffmeg.exe -i ..\test.mp3 -f wav pipe:1 …Run Code Online (Sandbox Code Playgroud) TL; DR:为什么freopen(NULL, "rb", stdin)在Windows 上总是失败?
我正在尝试base64在C中重新实现一个从stdin获取输入并将编码的等价物输出到stdout的编码器.我之前的帖子中有一个问题fread是过早发出EOF信号.这是我的主要方法:
int main(void)
{
unsigned char buffer[BUFFER_SIZE];
unsigned char base64_buffer[BASE64_BUFFER];
while (1)
{
TRACE_PUTS("Reading in data from stdin...");
size_t read = fread(buffer, 1, sizeof(buffer), stdin); /* Read the data in using fread(3) */
/* Process the buffer */
TRACE_PRINTF("Amount read: %zu\n", read);
TRACE_PUTS("Beginning base64 encode of buffer");
size_t encoded = base64_encode(buffer, read, base64_buffer, sizeof(base64_buffer));
/* Write the data to stdout */
TRACE_PUTS("Writing data to standard output"); …Run Code Online (Sandbox Code Playgroud) 目前我正在为原始数据(如 jpg 等)实施 Burrows-Wheeler 变换(和逆变换)。在对文本文件等普通数据进行测试时,不会出现问题。但是在读取 jpg 文件时,例如它会在字符 0x1a 又名替代字符处停止读取。我一直在互联网上搜索不采用操作系统相关代码但没有结果的解决方案......我想以二进制模式读取标准输入,但我猜这并不容易。有什么简单的方法可以解决这个问题吗?
代码:
buffer = (unsigned char*) calloc(block_size+1,sizeof(unsigned char));
length = fread((unsigned char*) buffer, 1, block_size, stdin);
if(length == 0){
// file is empty
}else{
b_length = length;
while(length == b_length){
buffer[block_size] = '\0';
encodeBlock(buffer,length);
length = fread((unsigned char*) buffer, 1, block_size, stdin);
}
if(length != 0){
buffer[length] = '\0';
encodeBlock(buffer,length);
}
}
free(buffer);
Run Code Online (Sandbox Code Playgroud)