0

シリアルポートから(おそらく)多重化されたシリアルデータを取り込む小さなプログラムを作成していますが、出力ファイルの読み取りと書き込みを含むこの機能に問題があります。Windowsフォームを使用すると、すべてが正常にコンパイルされます。

これが起こるはずのことです:[以下のコードスニペット]

プログラムの開始時に、ファイルが作成され、これが挿入されます。

DC1
DC2
DC3
DC4
JUNK:

〜何とか何とか、COMport が発生し、1 つのデータを含む文字列を取得します〜

そして、データの一部が渡される「WriteToFile」関数に到達します。(例えば 0.95) "NumberCheck" は、すべての非数値 (ただし '.' を含む) 部分のデータをフィルタリングします (がらくたの場合)。ファイルの各行が読み取られ、その長さが count に追加され、データがどの「ゾーン」に入るかがチェックされます。正しい行である場合は、マーカーがその行の末尾にあるファイル内の位置を指す必要があるため、行の読み取りを停止します。(fs は何か奇妙なことが起こった場合のフェイルセーフ カウンターです)。次に、その位置から最後までのファイルの長さを見つけ、一時に合わせてサイズを変更し、マーカーの後にあるもの(その位置を含む)で一時を埋め、マーカーでデータと一時を出力します...理論的には私のデータをに挿入します正しい場所。

私が抱えている問題は、「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();
}
4

1 に答える 1

0

string::findDC1、DC2、DC3 を調べるために を使用しないのはなぜですか?

文字列ライブラリを見てください。

ところで、あなたの質問にコメントを投稿することはできません。

次のようにする必要があります。

#include <iostream>
#include <string>
#include <fstream>
#include <sstream> 

using namespace std;

void WriteToFile(fstream &myfile, string& data, int zone)
{

    string fileline, srch;
    stringstream ss; //for int to string conversion
    ss << zone;
    srch="DC";
    srch.append(ss.str());

    int offset; 
    while(!myfile.eof())
    {
        getline(myfile, fileline);
        if ((offset = fileline.find(srch, 0)) != string::npos)
        {
            cout << "My search " << srch << endl;
        }
    }

    myfile.clear();
    myfile.seekg(0, ios::beg);

    // Write here

}


int main()
{
    string myfilename = "test";
    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();


    string write = "blalblablab";
    WriteToFile(myfile, write, 1);
    WriteToFile(myfile, write, 2);
    WriteToFile(myfile, write, 3);

    WriteToFile(myfile, write, 4);

    getchar();
    return 0;
}
于 2013-03-24T17:59:54.593 に答える