C++转换为 C# 读取文本以生成语句

C++ conversion to C# reading text to generate statements

本文关键字:语句 取文本 读取 转换 C++      更新时间:2023-10-16

我有一个 c++ 程序,它读取一个带有表单馈送作为页面/文档分隔符的文本文件。

我可以根据需要扫描文本文件并捕获表单提要。目前让我感到困惑的是 if() 语句中的一个奇怪之处。

我有一个 c++ 变量定义为:

DWORD dwTotalReadStmts;

在另一堂课上,我有以下方法:

BOOL CAG_StatementParser::GetFirstStatement(CAG_Statement& Statement)

上面的 BOOL 方法有一个来自 ReadStatement(Statement) 方法的返回,该方法读取语句并对从文本文件中读取的行执行各种工作。

总的来说,我有一个 if 语句,它使用 DWORD 来计算从方法返回的布尔值。 据我了解,DWORD 是一个无符号的长整数值。

CAG_Statement Statement;
int nStmts = -1;
if (dwTotalReadStmts = Parser.GetFirstStatement(Statement))

我试图将我的大脑包裹在 if 语句的工作原理上。 当我在 C# 中尝试类似的东西时,我收到有关类型冲突的错误(无法隐式将"bool"转换为"int")。

这是我需要转换为 c# 的 c++ 代码

CAG_StatementParser Parser;
if (Parser.Open(m_DataFileName.GetFilePathName()))
{
CAG_Statement Statement;
int nStmts = -1;
if (dwTotalReadStmts = Parser.GetFirstStatement(Statement))
{
nStmts = 1;
cout << setw(6) << nStmts << "r";
/* Write first statement */
if (!WriteStatement(Statement))
{
CleanUp(); return 1;
}
/* Write subsequent statement */
while ((dwTotalReadStmts = Parser.GetNextStatement(Statement)) == 1)
{
if (Statement.m_nTotalPages == 0)
break;
if (!WriteStatement(Statement))
{
break;
}
cout << setw(6) << nStmts++ << "r";
}
/* DONE! ->  clean up */
CleanUp();
}
if (nStmts == -1) {
cout << "No statement processed!" << endl;
}
else {
/* Display statistics */
ShowStats();
if (nStmts != dwTotalReadStmts) {
CString strTmp;
m_strLog += "There may exist an error when processing the input file.rn";
if (dwTotalReadStmts > 1) {
strTmp.Format("Total statements parsed does not agree with audit counts: %d vs %d!!!rn", nStmts, dwTotalReadStmts);
}
else {
strTmp.Format("Only parsed %d statements from the input file!!!rn", nStmts);
}
m_strLog += strTmp;
}
DumpLog(m_strLog);
}
}
else
{
cout << "Could not open statement file!" << endl;
}

这是我到目前为止拥有的 C# 代码的框架

StatementParser parser = new StatementParser();
FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
if (fileStream.CanRead)
{
Statement statement = new Statement();
int nStmts = -1;
if (nTotalReadStmts = StatementParser.GetFirstStatment(fileStream, out statement))
{
nStmts = 1;
Console.WriteLine(nStmts);
//write first statement
if (!WriteStatement(statement))
{
CleanUp();
return false;
}
//srite sebsequent statements
while ((nTotalReadStmts = StatementParser.GetNextStatment(fileStream, out statement)) == 1)
{
if (statement.M_nPages ==0)
{
break;
}
if(!WriteStatement(statement))
{
break;
}
Console.WriteLine(nStmts);
}
CleanUp();
}
if(nStmts == -1)
{
Console.WriteLine("No statment processed.");
}
else
{
/* Display statistics */
//ShowStats();
if(nStmts != nTotalReadStmts)
{
String strTmp = ""; ;
//write log file entry
if(nTotalReadStmts > 1)
{
strTmp += string.Format("Totals do not agree: {0} vs {1}", nStmts, nTotalReadStmts);
}
else
{
strTmp += string.Format("Parsed {0} statements from the input file", nStmts);
}
//add strTmp to log file
}
//write the logfile 
}
}
else
{
Console.WriteLine("Cannot read file.");
}

在C++中,这...

if (dwTotalReadStmts = Parser.GetFirstStatement(Statement)) 
{
//  ...

等于此:

dwTotalReadStmts = Parser.GetFirstStatement(Statement);
if (dwTotalReadStmts != 0)
{
//  ...

那是因为

在 C 和 C++ 中,整数值为零是布尔值
  1. false,非零整数值是布尔值 true。它们在这些语言中是可以互换的,但在 C# 中它们不是。
  2. 在任一语言中,赋值表达式返回分配的值:

    int x = 1;
    int y = 2;
    //  Now z is equal to 1
    int z = (y = x);
    

    这样做是为了过滤掉 CS101 中的弱者。

因此,它调用 GetFirstStatement(),将(无符号长)返回值分配给 dwTotalReadStmts,然后将相同的无符号长整型值解释为布尔值。

第二个版本是有效的 C#,假设Parser.GetFirstStatement(Statement)仍然返回某种整数——尽管在 C# 中我们不会使用dw前缀来表示DWORD

if-语句

if (dwTotalReadStmts = Parser.GetFirstStatement(Statement))
{
// do something
}

dwTotalReadStmts = Parser.GetFirstStatement(Statement);
if (dwTotalReadStmts != 0)
{
// do something
}