Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++空间转换_C++_File Io - Fatal编程技术网

C++空间转换

C++空间转换,c++,file-io,C++,File Io,我试图将三个参数传递给我的write函数: write(fd, "C,1,1\r\n", 7); 这个很好用。但我想获取一个参数并将其传递给命令部分,使其成为动态的: write(fd, N, 4); 我不熟悉C++类型,但是它总是要求一种类型的空余*。我已经能够将变量n转换成两种不同的格式,希望一个变量更容易转换。这就是我尝试过的: const fmx::FixPt& outValue = dataVect.AtAsNumber(3); const double N = out

我试图将三个参数传递给我的write函数:

write(fd, "C,1,1\r\n", 7);
这个很好用。但我想获取一个参数并将其传递给命令部分,使其成为动态的:

write(fd, N, 4);
<>我不熟悉C++类型,但是它总是要求一种类型的空余*。我已经能够将变量n转换成两种不同的格式,希望一个变量更容易转换。这就是我尝试过的:

const fmx::FixPt&  outValue = dataVect.AtAsNumber(3);
const double  N = outValue.AsLong();

double  N = outValue.AsLong();
所以double和const double可能是差不多的东西。。。我不太懂C++ 我也可以把它作为:

const fmx::FixPt&  outValue = dataVect.AtAsNumber(3);
write(fd, outValue, 4);
但我认为,询问每个人如何转换double要比试图解释或找出像const-fmx::FixPt&…这样独特的东西要好得多

*我还尝试:

write(fd, &N, 4);
这只会消除我的错误,但仍然不起作用

那么,甚至可以转换为const void*类型吗

多谢各位

以下是代码:

const fmx::FixPt& outValue = dataVect.AtAsNumber(3);
double  N = outValue.AsLong();

int fd;
struct termios options;
fd=open("/dev/tty.KeySerial1", O_RDWR | O_NOCTTY | O_NDELAY);
fcntl(fd, F_SETFL, 0);
tcgetattr(fd,&options);
options.c_ispeed=57600;
options.c_ospeed=57600;
options.c_cflag |= (CLOCAL | CREAD);
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_cflag &= ~CSTOPB;
options.c_lflag &= ~ECHO;
options.c_oflag &= ~ECHO;
options.c_oflag &= ~OPOST;
options.c_cflag |= CS8;
options.c_cflag |= CRTSCTS;
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] =10;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&options);


if( tempText->Assign("2"), *tempText == direction ) {
    write(fd, "C,1,2\r\n", 7);//Direction
}else{
    write(fd, "C,1,1\r\n", 7);//Direction
}

if( tempText->Assign("1"), *tempText == speed ) {
    write(fd, "C,2,1\r\n", 7);//Speed
} else if( tempText->Assign("2"), *tempText == speed ) {
    write(fd, "C,2,2\r\n", 7);//Speed
} else if( tempText->Assign("3"), *tempText == speed ) {
    write(fd, "C,2,3\r\n", 7);//Speed
} else if( tempText->Assign("4"), *tempText == speed ) {
    write(fd, "C,2,4\r\n", 7);//Speed
} else if( tempText->Assign("5"), *tempText == speed ) {
    write(fd, "C,2,5\r\n", 7);//Speed
} else if( tempText->Assign("6"), *tempText == speed ) {
    write(fd, "C,2,6\r\n", 7);//Speed
} else if( tempText->Assign("7"), *tempText == speed ) {
    write(fd, "C,2,7\r\n", 7);//Speed
} else if( tempText->Assign("8"), *tempText == speed ) {
    write(fd, "C,2,8\r\n", 7);//Speed
} else if( tempText->Assign("9"), *tempText == speed ) {
    write(fd, "C,2,9\r\n", 7);//Speed
} else if( tempText->Assign("10"), *tempText == speed ) {
    write(fd, "C,2,10\r\n", 8);//Speed
} else if( tempText->Assign("11"), *tempText == speed ) {
    write(fd, "C,2,11\r\n", 8);//Speed
} else if( tempText->Assign("12"), *tempText == speed ) {
    write(fd, "C,2,12\r\n", 8);//Speed
} else if( tempText->Assign("13"), *tempText == speed ) {
    write(fd, "C,2,13\r\n", 8);//Speed
} else if( tempText->Assign("14"), *tempText == speed ) {
    write(fd, "C,2,14\r\n", 8);//Speed
} else if( tempText->Assign("15"), *tempText == speed ) {
    write(fd, "C,2,15\r\n", 8);//Speed
} else if( tempText->Assign("16"), *tempText == speed ) {
    write(fd, "C,2,16\r\n", 8);//Speed
} else if( tempText->Assign("17"), *tempText == speed ) {
    write(fd, "C,2,17\r\n", 8);//Speed
}



if(tempText->Assign("1"), *tempText == length){
    write(fd, "C,3,", 4);
    write(fd, "1", 1);
    write(fd, "\r\n", 2);
} else if(tempText->Assign("2"), *tempText == length){
    write(fd, "C,3,", 4);
    write(fd, "10", 2);
    write(fd, "\r\n", 2);
} else if(tempText->Assign("3"), *tempText == length){
    write(fd, "C,3,", 4);
    write(fd, "100", 3);
    write(fd, "\r\n", 2);
} else if(tempText->Assign("4"), *tempText == length){

    write(fd, "C,3,", 4);
    write(fd, N, 4);
    write(fd, "\r\n", 2);
}


close(fd);
错误:无法将参数“2”的“double”转换为“const void*”,将参数“2”转换为“ssize\t writeint,const void*,size\t”

write命令只获取一个数据块并写入文件描述符。因此,如果您想写入保存在double中的二进制数据,您可以执行以下操作:

write(fd, &N, sizeof(double));
请注意,这会将二进制数据而不是人类可读的ASCII数据写入文件描述符。这可能很危险,因为数据存储在本地体系结构的字节顺序中,但根据应用程序的不同,这可能不是一个问题

通常,在C++中,你将使用运算符:

double N = 0.0;

// write data to file
ofstream out("myfile", ofstream::binary);
out << N;
out.close();

// read data back
ifstream in("myfile", ifstream::binary);
in >> N;
in.close();
流运算符被重载以接受多种参数,包括字符串:

out << "hello world: " << 42 << endl;
write函数的第二个参数是指向缓冲区(字节数组)的指针,第三个参数是缓冲区的大小。因此,您需要以某种方式获取要写入该文件的字节数组

你的解决方案

write(fd, &N, 4);
如果N是4字节长的东西,则将工作。然而,这似乎不是你想要的


从你的问题中不清楚你到底想要完成什么。你想写一个字符串吗?然后,您需要将N转换为一个字符串,并传递该字符串第一个字节的地址进行写入。

从您的工作示例来看,write似乎将常量字符*作为第二个参数,常量字符*中的字符长度数作为第三个参数

所以writefd,C,1,1\r\n,7;正在传递一个指向C,1,1\r\n的常量字符*,长度为7个字符

如果要传入变量而不是硬编码的C,1,1\r\n,则需要执行以下操作:

int someNum = 7; // example variable

const int BUFFERSIZE = 256;
char strBuffer[BUFFERSIZE];
snprintf( strBuffer, BUFFERSIZE, "whatever you like, even a number: %d\n\r", someNum );
write( fd, str, BUFFERSIZE );

在我看来,您的问题似乎是从双精度转换为字符串。我认为,如果N的值为2000,那么您希望写出字符“2”、“0”、“0”和“0”,而不是2000.0的内部表示形式

实际上,我看到您使用了一个函数outValue.AsLong,我希望它返回一个长值,它是一个整数,而不是一个双精度浮点值,在这种情况下处理整数会更方便。在这种情况下,double和long是数据类型

在C语言中,将数字转换为字符串有点笨拙,通常使用sprintf函数完成。这有点棘手。首先,必须指定要将字符串写入的字符数组。确保它足够大,可以容纳最大的数字,并添加一个,因为sprintf会再写一个字符来标记字符串的结尾。大多数C字符串函数都有。然后用它给sprintf打电话。让我们来看看这个

char string_value[5];  /* we're assuming the number is always between 0 and 9999 */
long long_value = outValue.asLong();
sprintf(string_value, "%04ld", long_value);
write (fd, string_value, 4);

为了解释其中一些:我们使用5个字符作为字符串_值,因为我们需要字符数加1。我们将该值转换为long_值,然后使用sprintf函数将该值转换为string_值。sprintf的第一个参数是结果所在的内存区域,第二个参数是格式字符串,下面是您输入到字符串中的值。在格式字符串中,“%”表示它将描述一个字段,“0”表示零填充结果,“4”表示至少使用四个字符,“ld”表示您正在传入一个长值。

您实际想做什么?很难从你所写的内容中分辨出来,根据你的最终目标,答案可能会有所不同。请注意结尾的第三行:这只会消除我的错误,但仍然不起作用。你什么意思不起作用?你想实现什么?对不起,各位,有时候我觉得如果我提供了太多的信息,那么我只会混淆问题。我正在为FileMaker编写一个插件,它将打开一个串行端口并向跟踪设备发送命令,如C、7C、1、1等。。。除了我需要命令C,3,X之外,所有的东西都能工作,这将需要1-10000之间的数字。我想把那个号码传过去。之前我只是在3000或其他地方硬编码,但我需要传递变量。当我编译它给我我的转换错误,但当我添加
没有错误,但当我运行脚本时,跟踪/扫描设备不会执行任何操作。谢谢,对不起,我应该添加更多信息。我有一个if/else if语句,它正在检查长度:。。。else-iftempText->Assign4,testext==长度{…所以我知道4是正确的,我通过了1000我的工作示例:writefd,C,1,1\r\n,7;它看起来确实像一个字符串,但它一直在说无法将uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu转换为'const void',为什么它要求'const void*'它看起来像一个字符串…旁注,我尝试过const void tester=1000;它工作了…所以'const void*?再次感谢!在C中,一个字符串指针,如C,1,1,\r\n,类型为const char将自动转换为空隙*。然而,在C++中,需要用const Value*C,1,1,\r\n显式地铸造。注意,在这样的转换之前,仍然需要按您想要的格式来获得它。C++中,您确实希望做静态的CASTATATA数据,而不是C风格的CAS。事实上,J.HdEdTunes是一个标准函数,它不存在于标准的函数中。它存在于Visual C++中,而且在我所知的范围内,没有其他的地方。如果你使用其他编译器,你需要使用SpReTF或编译器的特定函数。如果你使用Visual C++,那么SyPrtffs是安全的。感谢David,我已经用sprintf的便携安全版本更新了这个示例。