Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
File 在将数据写入服务器返回的文本文件时,会在某些行中插入一些额外的垃圾值_File_Sockets_Text Files_Openstreetmap_Garbage - Fatal编程技术网

File 在将数据写入服务器返回的文本文件时,会在某些行中插入一些额外的垃圾值

File 在将数据写入服务器返回的文本文件时,会在某些行中插入一些额外的垃圾值,file,sockets,text-files,openstreetmap,garbage,File,Sockets,Text Files,Openstreetmap,Garbage,这是创建套接字并将接收到的数据存储在文本文件中的代码 // Initialize Winsock. cout << "connecting1\n"; WSADATA wsadata; int iResult = WSAStartup (MAKEWORD(2,2), &wsadata ); if (iResult !=NO_ERROR ) printf("\nmyERROR at WSAStartup()\n"); int

这是创建套接字并将接收到的数据存储在文本文件中的代码

// Initialize Winsock.
    cout << "connecting1\n";
    WSADATA wsadata;
    int iResult = WSAStartup (MAKEWORD(2,2), &wsadata );
    if (iResult !=NO_ERROR )
        printf("\nmyERROR at WSAStartup()\n");
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == -1) {
        perror("error opening socket"); return -1;
    }
    struct sockaddr_in sin;
    sin.sin_port = htons(port);
    sin.sin_addr.s_addr = inet_addr(host.c_str());
    sin.sin_family = AF_INET;

    if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
        perror("error connecting to host"); return -1;
    }
    const int query_len = query.length() + 1; // trailing '\0'
    if (send(sock, query.c_str(), query_len, 0) != query_len) {
        perror("error sending query"); return -1;
    }

    const int buf_size = 1024 * 1024;
    while (true) {
    std::vector<char> buf(buf_size, '\0');
    const int recv_len = recv(sock, &buf[0], buf_size - 1, 0);

    if (recv_len == -1) {
        perror("error receiving response"); return -1;
    } else if (recv_len == 0) {
        std::cout << std::endl; break; 
    } else {
       std::cout << &buf[0];
   fprintf(fp, "%s", &buf[0]);   // this lines writes to file
    }
}
所以我的程序无法正确解析这个节点。 在url中写入查询时,数据以正确的格式显示。 每次运行程序时,垃圾值也会被插入到相同的位置。
为什么会发生这种情况?

在recv函数中,它为缓冲区调用字符指针。您已将缓冲区声明为字符向量,这与char buf[1024*1024]不同。所以我相信当你把它打印到文件中时,向量会返回一个项目结构的字符串。向量包含类型为char的1024*1024个对象,而不是用于存储字符的1024*1024大小的连续内存。1024*1024向量包含作为单独元素存储的字符对象,但不作为连续分配存储在内存中


我将更改为std::vector buf(buf_大小,'\0')字符buf[1024*1024]然后在使用recv读取数据之前执行内存集(buf,0,1024*1024)。我相信这将纠正这个问题(假设您没有通过套接字发送\0作为数据,这将指示字符串的结尾,在这种情况下%s将在该点停止打印数据)。

我从openStreetMap帮助论坛得到了答案,该论坛更具体地回答了上述问题


我运行并看到写入文件时没有问题,但屏幕上的数据如果由std::打印,则无法让我理解。。。当您只是将垃圾写入文件(无标准输出打印)时,垃圾不会出现?您假设以null结尾的字符串。read()和recv()不为null终止缓冲区,因此垃圾是以前读取的剩余内容。相反,您应该使用read()、recv()的返回值(“代码中的recv_len”)。
std::vector
始终按照标准的定义连续存储内存。
{
  "type": "node",
  "id":

1000     // this 1000 is un-wanted

 1812432236,
  "lat": 20.2608987,
  "lon": 85.8379894
},