BCB字符串处理的怪事
目的:从文件中读出字符串,该文件可以视为文本文件。
文本字符串示例:
1P5V_DUAL_PHASE_20; PR505.2 PC505.1 PL500.1 PQ502.D,
PQ500.S PJP500.1 PU501.8 PR503.2,
PC550.1
说明:该示例为一个项目,我通过判断逗号来判断是否应该读取下一行和上面的行来组成一个字符串,项目的存取通过链表实现。
BUG:我在多台计算机上测试,只有一台计算机显示字符串为:1P5V_DUAL_PHASE_20; PR505.2 PC505.1 PL500.1 PQ502.D,(错误)
其他的计算机都显示为:1P5V_DUAL_PHASE_20; PR505.2 PC505.1 PL500.1 PQ502.D, PQ500.S PJP500.1 PU501.8 PR503.2, PC550.1(正确)
问题:为什么会出现同一文件在一台计算机上的读取错误,而其他计算机又是正确的。
代码:
void __fastcall TForm1::OpenTheSecondFile1Click(TObject *Sender)
{
int i, j, length;
int x, LineCount;
char *pFileTwoContent;
AnsiString FileTwoContent;
OpenDialog1->FileName = "";
if(OpenDialog1->Execute())
{
FileTwoRichEdit->Clear();
if(OpenDialog1->FileName!="")
{
FileTwoRichEdit->Lines->LoadFromFile(OpenDialog1->FileName);
F_TwoEdit->Text = OpenDialog1->FileName;
}
}
LineCount = FileTwoRichEdit->Lines->Count; //返回文件文本行数
if(OpenDialog1->FileName!="")
{
pFileTwoNETS1 = pFileTwoNETS2 = (struct CheckContentNETS *)malloc(LENN);
for(j=0;j<50;j++)
{
pFileTwoNETS1->Name[j] = '\0';
}
pFileTwoNETSHead = pFileTwoNETS1;
for(i = 1;((FileTwoContent = FileTwoRichEdit->Lines->Strings[i])!="$END")&&(i<LineCount);i++)
{
for(;FileTwoContent == "";i++)//跳过空行
{
FileTwoContent = FileTwoRichEdit->Lines->Strings[i];
}
if(i==1)
{
pFileTwoNETSHead = pFileTwoNETS1;
}
else
{
pFileTwoNETS2->Next = pFileTwoNETS1;
}
if(FileTwoContent == "$NETS")//跳过标志行
{
i = i + 1;
FileTwoContent = FileTwoRichEdit->Lines->Strings[i];
}
pFileTwoContent = FileTwoContent.c_str();
for(j=0;*(pFileTwoContent+j) != '\0';j++)//将指针移动到一行文本末端
{}
while(*(pFileTwoContent+j-1) == ',')//判断和读取完一条完整的信息
{
i = i + 1;
FileTwoContent = FileTwoContent + FileTwoRichEdit->Lines->Strings[i];
pFileTwoContent = FileTwoContent.c_str();
for(j=0;*(pFileTwoContent+j) != '\0';j++)
{}
}//这里读取完后就可以用控件打印FileTwoContent的信息,但是就会出现上述错误
for(j=0;(*(pFileTwoContent+j) != ';')&&(*(pFileTwoContent+j)!= '\0'); j++)//读取项目名
{
pFileTwoNETS1->Name[j] = *(pFileTwoContent+j);
}
//将一条项目的文本信息包括名字全部存入链表
length = FileTwoContent.Length() + 1;
pFileTwoNETS1->Content = new char[length];
memset(pFileTwoNETS1->Content, '\0', length);
memcpy(pFileTwoNETS1->Content, pFileTwoContent, length);
pFileTwoNETS2 = pFileTwoNETS1;
pFileTwoNETS1 = (struct CheckContentNETS*)malloc(LENN);
for(j=0;j<50;j++)
{
pFileTwoNETS1->Name[j] = '\0';
}
}
pFileTwoNETS2->Next = NULL;
free(pFileTwoNETS1); // Release the null struct
MessageDlg("File Two is loaded completed!", mtInformation, mbOKCancel, 0);
}
}