You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++转C#:文本读取语句生成的if语句类型冲突问题

解决C++到C#转换中的赋值判断类型冲突问题

核心问题在于C++和C#对布尔/整数类型的处理差异:

  • 在C++中,BOOL是int的别名(Windows SDK定义),所以dwTotalReadStmts = Parser.GetFirstStatement(Statement)这种赋值后直接用整数作为判断条件的写法是合法的(非0值视为true)。
  • 但C#中bool和int是严格区分的类型,不允许隐式转换,所以直接把返回bool的方法赋值给int变量会报错。

第一步:修正方法返回值类型

首先要对齐C方法的实际语义:你的C代码中GetFirstStatement和GetNextStatement返回的是代表读取语句数量的整数(1表示成功读取1条,0表示失败),而非单纯的布尔值。所以在C#中,对应的方法应该返回int,而不是bool。

调整StatementParser的方法签名:

public class StatementParser
{
    // 修正返回值为int,对应C++的DWORD/BOOL返回值
    public static int GetFirstStatement(FileStream stream, out Statement statement)
    {
        // 实现逻辑:成功读取返回1,失败返回0
        // ...你的原有实现...
    }

    public static int GetNextStatement(FileStream stream, out Statement statement)
    {
        // 实现逻辑:成功读取返回1,失败返回0
        // ...你的原有实现...
    }
}

第二步:调整条件判断的写法

在C#中,你可以保留“赋值+判断”的写法,但需要明确判断赋值后的整数是否符合预期(非0表示成功,等于1表示读取到下一条):

以下是完整的修正后C#代码:

StatementParser parser = new StatementParser();
using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
    if (fileStream.CanRead)
    {
        Statement statement;
        int nStmts = -1;
        int nTotalReadStmts = 0;

        // 修正:先赋值,再判断是否非零(对应C++的if(赋值)逻辑)
        if ((nTotalReadStmts = StatementParser.GetFirstStatement(fileStream, out statement)) != 0)
        {
            nStmts = 1;
            Console.WriteLine($"{nStmts,6}\r"); // 对应C++的setw(6)

            // 写入第一条语句
            if (!WriteStatement(statement))
            {
                CleanUp();
                return false;
            }

            // 读取并写入后续语句
            while ((nTotalReadStmts = StatementParser.GetNextStatement(fileStream, out statement)) == 1)
            {
                if (statement.M_nPages == 0)
                {
                    break;
                }
                if (!WriteStatement(statement))
                {
                    break;
                }
                Console.WriteLine($"{nStmts++,6}\r");
            }
            CleanUp();
        }

        if (nStmts == -1)
        {
            Console.WriteLine("No statement processed!");
        }
        else
        {
            // 显示统计信息(可补充ShowStats实现)
            // ShowStats();

            if (nStmts != nTotalReadStmts)
            {
                string strTmp = "";
                if (nTotalReadStmts > 1)
                {
                    strTmp = string.Format("Total statements parsed does not agree with audit counts: {0} vs {1}!!!\r\n", nStmts, nTotalReadStmts);
                }
                else
                {
                    strTmp = string.Format("Only parsed {0} statements from the input file!!!\r\n", nStmts);
                }
                // 将日志内容添加到m_strLog(可根据你的日志实现调整)
                // m_strLog += strTmp;
                // DumpLog(m_strLog);
            }
            // 写入日志文件(补充你的DumpLog实现)
        }
    }
    else
    {
        Console.WriteLine("Could not open statement file!");
    }
}

额外优化点

  1. 使用using语句包裹FileStream,确保文件流自动释放,避免资源泄漏。
  2. 修正了代码中的拼写错误(如statment→statement,srite→write)。
  3. 使用C#的字符串插值$"{nStmts,6}\r"替代setw(6),实现相同的宽度格式化效果。

内容的提问来源于stack exchange,提问作者lsieting

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:24:31