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!"); } }
额外优化点
- 使用
using语句包裹FileStream,确保文件流自动释放,避免资源泄漏。 - 修正了代码中的拼写错误(如
statment→statement,srite→write)。 - 使用C#的字符串插值
$"{nStmts,6}\r"替代setw(6),实现相同的宽度格式化效果。
内容的提问来源于stack exchange,提问作者lsieting
相关产品推荐
相关产品推荐

