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



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

// Initialize Winsock.
    cout << "connecting1n";
    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 ''
    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, '');
    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
    }
}

这里的数据大多以正确的格式返回,但在某些情况下会发生这种情况:

{
  "type": "node",
  "id":
1000     // this 1000 is un-wanted
 1812432236,
  "lat": 20.2608987,
  "lon": 85.8379894
},

所以我的程序无法正确解析此节点。在 url 中写入查询时,数据以正确的格式显示。此外,每次运行程序时,垃圾值都会插入到同一位置。为什么会这样?

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

链接到我在那里发布的问题

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

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

相关内容

  • 没有找到相关文章

最新更新