2016-07-07 3 views
0

私は今、私はこの関数を呼び出していたから、別のクラスを、この機能を持っている1つのCSVReaderクラス、なぜUtf8Charのベクトルの値が変化していますか?私はいくつかのセットで<code>localVec</code>の値を比較しています</p>ここ <pre><code>FILE *fp; fp = fopen("SampleFile.csv", "r"); while((getc(fp)) != EOF) { bvector<Utf8Char*> localVec = csvFile.ReadFile(fp); } </code></pre> <p>:

vector<UtfChar*> CSVFile::ReadFile(FILE* fp) 
{ 
    //int count = 0; 
    Utf8Char buff[256]; 

    fgets(buff, 256, (FILE*)fp); 
     // count++; 

    Utf8Char *token = strtok(buff, ","); 
    bvector<UtfChar*> localVec; 
    while (token != NULL) 
    { 
     localVec.push_back(token); 
     token = strtok(NULL, ","); 
    } 
    return localVec; 
} 

を持っています値の(char*)私は持っています。しかし、この他のクラスでは、localVec[0]やl ocalVec[1]のようなベクトルにアクセスしようとすると、それはゴミを与えています。 私はCSVReaderクラス自体で比較を試みた後、そこで動作しています。しかし、私は他のクラスで比較を行う必要があるので、他のCSVファイルに対して同じCSVReaderクラスを使用することができます。

+3

ポインタとC関数。何がうまくいかない? 1つのバッファを使用しているため、すべてのベクトル要素がそれを参照してから破棄されます。 C++標準ライブラリを使用してください。 – LogicStuff

+0

「ごみ」とはどのようなものですか? Utf8Charはどのように定義されていますか? – user3684240

+0

@LogicStuffプログラマーがローカル変数の範囲や単純なポインタの扱い方を習得できない場合、C++標準ライブラリを使用することは役に立ちません。 –

答えて

2

ここで問題となるのは、ポインタが絡んでいることです。あなたは、だから今は、ローカルバッファの各セグメントへのポインタの完全なベクトルを持っている

Utf8Char buff[256]; 

fgets(buff, 256, (FILE*)fp); 

が次にあなたが

Utf8Char *token = strtok(buff, ","); 
bvector<UtfChar*> localVec; 
while (token != NULL) 
{ 
    localVec.push_back(token); 
    token = strtok(NULL, ","); 
} 

とそのバッファの異なるセグメントへのポインタを取得してローカル配列を作成し、移入します。関数からベクトルを返すと、ローカルバッファは破棄されます。これは、あなたが今持っているすべてのポインタが、もはや所有していないメモリを指すことを意味します。これらのポインタを使用することは未定義の動作であり、あなたがガベージ出力を得る理由です。

また、How can I read and parse CSV files in C++?を使用してCSVファイルを解析すると、これらのC-ismのすべてを回避できます。

+0

ありがとうございましたNathan :) – Logan0486

1

このコード

bvector<UtfChar*> localVec; 

はあなたのベクトルにポインタを格納していることを意味します。

これらのポインタは、関数が復帰したときに範囲外になるローカル変数を指します。

while((getc(fp)) != EOF){ 
    bvector<Utf8Char*> localVec = csvFile.ReadFile(fp); 
} 

それは意図的なものです:あなたがファイルから読み出された各文字列の最初の文字をスキップするように

0

に見えますか? UTF-8文字は可変長(例えば、1バイトで表現されるもの、2バイトで表現されるもの、6バイトまで表現されるものなど)である可能性があります。文字列変換を行わない場合は、UTF-8文字列をバイトごとに1つの場所から別の場所にコピーできます。文字列は有効なままなので、文字の長さを心配する必要はありません。しかし、文字列の最初のバイトを切り捨てると、有効なUTF-8文字列でなくなり、そのように解釈できなくなります。

+0

いいえ意図的ではありません。どのようにそれを避けるために..ありがとうBTW – Logan0486

関連する問題

 関連する問題