MALOUDA-PSA 2024-02-19 21:59 采纳率: 91%
浏览 3
已结题

c++跳出for循环嵌套


#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "json.hpp"

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "ProtocolParser.h"

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using nlohmann::json;

#define filename "data.json"

int main(void)
{
    ifstream file(filename, ios::in | ios::binary);

    if(!file.is_open()){
        throw runtime_error("Faile open the file.");
        }

    file.seekg(0,ios::end);
    streamsize fileSize = file.tellg();
    if(fileSize <=0){
        throw runtime_error("File is emppty");
        }

    char *buffer = new char[fileSize];

    file.seekg(0,ios::beg);
    file.read(buffer, fileSize);
    cout << fileSize << "filesize" << endl;
    if(!file || static_cast<streamsize>(content.size()) != fileSize) {
        throw runtime_error("Reading failed or did not read all data from the file.");
        }


    file.close();
    ProtocolParser parse;
    json j = parse.doParse(buffer);

   for (auto it = j.begin(); it != j.end(); ++it){
                    if (it->is_string()){
                    string vstr = it.value().get<string>();
                    cout << "it key: " <<  it.key() << endl;
                    cout << "it value: " <<  vstr << endl;
                    }
//      cout << *it << endl;
//      cout << it.key() << endl;
//      cout << it.value()  << endl;
    if (it->is_array()){
                    cout << "it is array " << endl;
        try {
            ProtocolParser parse1;
            string valueStr = it.value();
            const char* valueChar = valueStr.c_str();
            size_t len = strlen(valueChar);

            char* recvdata = new char[len];

            strcpy(recvdata, valueChar);
            json k = parse1.doParse(recvdata);
            delete []recvdata;
            for (auto subit = k.begin(); subit != k.end(); ++subit){
                    if (subit->is_string()){
                    cout << "subit: " <<  *subit << endl;
                    }
                    if (subit->is_array()){
                    string vstr1 = subit.value().get<string>();
                    cout << "subit: " <<  vstr1 << endl;
                    continue;
                    }
//                  cout << subit.key() << endl;
//                  cout << subit.value()  << endl;

                }

        }catch(exception& e){
        cerr << "err parsing JSON:" << e.what() << endl << endl;
        }
    }
    }
  return 0;
}



代码里面加入了两个for 循环,目的就是不让进入异常, 可是还是进入了异常, 是不是continue放错地方了,另外,能不能写成递归函数? 可以不断循环解析array

  • 写回答

2条回答 默认 最新

  • GISer Liu 2024-02-20 00:03
    关注

    该回答引用自GPT-3.5,由博主GIS_Liu编写:

    首先,让我们仔细检查代码并解决问题。你提到想要避免进入异常,但目前代码似乎存在一些问题。我会一步步分析并提出解决方案。

    问题分析:

    1. 异常问题:你提到想要避免进入异常,但目前的代码中有异常处理,可能需要调整位置或逻辑来确保正常执行。
    2. 继续语句位置:你怀疑continue语句的位置是否正确,可能需要重新检查其放置位置。
    3. 递归函数:你想知道是否可以将循环解析数组的部分改写成递归函数,以便持续解析数组。

    解决方案:

    1. 异常处理位置调整:异常处理应该放在可能出现异常的代码周围。在这种情况下,可能出现异常的地方是从文件读取数据、解析 JSON 数据等。确保异常处理逻辑围绕这些代码。
    2. 继续语句位置检查:continue语句的位置应该根据逻辑需要进行调整。如果希望在数组解析过程中遇到非数组元素时继续解析下一个元素,则continue语句的位置可能需要放在正确的位置。
    3. 递归函数实现:可以将数组解析部分改写成递归函数,使其能够持续解析数组。递归函数应该能够接受 JSON 数组作为参数,并递归地解析其中的元素。

    代码修改建议:

    根据以上分析,下面是可能需要修改的部分代码及建议:

    if (it->is_array()) {
        cout << "it is array " << endl;
        try {
            // 调整异常处理位置
            ProtocolParser parse1;
            string valueStr = it.value();
            const char* valueChar = valueStr.c_str();
            size_t len = strlen(valueChar);
            char* recvdata = new char[len];
            strcpy(recvdata, valueChar);
            json k = parse1.doParse(recvdata);
            delete []recvdata;
            for (auto subit = k.begin(); subit != k.end(); ++subit) {
                if (subit->is_string()) {
                    cout << "subit: " <<  *subit << endl;
                }
                if (subit->is_array()) {
                    string vstr1 = subit.value().get<string>();
                    cout << "subit: " <<  vstr1 << endl;
                    // 继续语句放置位置需要根据逻辑需要调整
                    continue;
                }
                // 如果希望在解析非数组元素时继续解析下一个元素,continue语句放置在这里
                // continue;
            }
            // 继续语句放置位置需要根据逻辑需要调整
            // 如果希望在解析完数组内所有元素后继续解析下一个数组,continue语句放置在这里
            // continue;
        } catch (exception& e) {
            cerr << "err parsing JSON:" << e.what() << endl << endl;
            // 异常处理逻辑放置位置需要根据实际情况调整
            // 继续语句放置位置需要根据逻辑需要调整
            // 如果希望在出现异常时跳过当前数组解析,continue语句放置在这里
            // continue;
        }
    }
    

    以上是对代码的一些修改建议,根据实际情况可能需要调整代码逻辑和异常处理位置。另外,关于递归函数的实现,需要进一步思考如何设计递归函数来持续解析 JSON 数组。

    如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订

    用户答题指南

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月28日
  • 已采纳回答 2月20日
  • 创建了问题 2月19日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效