我正在创建一个小程序来从串行端口(可能)接收多路复用的串行数据,但是在涉及读取和写入我的输出文件的功能时遇到问题。一切都使用 Windows 窗体编译得很好。
这是应该发生的事情:[下面的代码片段]
在程序开始时,创建一个文件并插入:
DC1
DC2
DC3
DC4
JUNK:
~blah blah blah,COMport 发生了,我们得到一个包含一个数据的字符串~
我们来到了“WriteToFile”函数,它传递了一条数据。(比如 0.95)“NumberCheck”过滤所有非数字(但包括'.')部分的数据(以防垃圾)。读取文件的每一行,将其长度添加到计数中并检查数据将进入哪个“区域”。如果它是正确的行,则停止行读取,因为标记应指向文件中该行末尾的位置。(fs 是一个故障安全计数器,以防发生奇怪的事情)。然后我找到从那个位置到结尾的文件长度,调整 temp 的大小以适应,用标记之后的内容(包括那个位置)填充 temp,然后在标记处输出我的数据和 temp ...理论上将我的数据插入正确的地方。
我遇到的问题是,在第一次运行“WriteToFile”之后,文件行什么也没有出现,所以标记永远找不到它的位置。此外,即使在刷新文本文件后也没有任何变化的迹象(这是实现流的正确方法吗?)
以下是相关代码: 打开文件:
//opening file with the name in the textbox
string myfilename = txtboxCONT;
myfilename.append(".txt");
myfilename="test.txt"; //temporary name, DELETE BEFORE PUBLISH <<.
fstream myfile(myfilename,ios::in | ios::out | ios::trunc);
if (!myfile.is_open())
throw;
//initial file set-up
int i;
for (i=1;i<=4;i++)
myfile << "DC" << i << "\n";
myfile << "JUNK:";
myfile.flush();
还有我的写作功能:
void WriteToFile(fstream &myfile, string& data, int zone)
{
data = NumberCheck(data); //filters out non-numeric data, returns "null" if nothing left.
if (data=="null") //if the filter leaves no valid output, no need to write.
return;
myfile.seekg(0); //set initial position at the start?
string fileline, srch, out;
stringstream ss; //for int to string conversion
ss << zone;
srch="DC";
srch.append(ss.str());
int fs=1, marker=0;
while(fs<=4) //test each line if it beins with DC(zone)
{
getline(myfile, fileline);
marker = marker + fileline.length() + 1;
if (srch==fileline.substr(0,3))
break;
fs++;
}
if (fs!=5)
{
//can't avoid overwriting so... this is gon' suck...
string temp;
myfile.seekg(0,ios::end);
int length = myfile.tellg();
length = length - marker;
temp.resize(length);
myfile.seekg(marker);
myfile.read(&temp[0],temp.size());
myfile.seekp(marker);
myfile << ',' << data << temp;
}
else
{
myfile.seekp(0,ios::end);
myfile << ',' << data;
}
myfile.flush();
data.clear();
}