トン、素敵な試みと素敵な完全な質問
建設中。ここに答えがある:
1)あなたは、ループの後にセミコロンを持っている:
while(getline(infile, data));
は、それを削除します。
どのように私はそれを簡単に把握できましたか?
C02QT2UBFVH6-lm:~ gsamaras$ g++ -Wall main.cpp
main.cpp:24:33: warning: while loop has empty body [-Wempty-body]
while(getline(infile, data));
^
main.cpp:24:33: note: put the semicolon on a separate line to silence this warning
1 warning generated.
実際には、あなたにも-Wall
ことなく、その警告を取得する必要がありますが、それを使用して入る、それはまた、あなたに良いようになります:私はこのように、有効なすべての警告をコンパイル! :)
2)次に、いくつかの要素を読みますが、10ではなく、なぜ10を印刷しますか?実際に読んだもの、つまりi
の数だけ印刷してください。
配列の10要素をすべて印刷しようとすると、構造体の配列を初期化していないため、初期化されていない要素が表示されます。
さらに、datafile.csv
の行数は10未満でした。そのため、配列の作成を開始しましたが、ファイルに行がないときに停止しました。その結果、配列の一部の要素(最後の6つの要素)の一部が未初期化のまま残っていました。
初期化されていないデータを印刷すると、未定義の動作、そのため、ガベージ値が表示されます。
3)また、この:
if (infile.is_open()) //error check
は次のように書くことができます一緒にすべてを置く
if (!infile.is_open())
cerr << "Error Message by Mr. Tom\n";
:ss >> arrayData[i].username;
が食べるので
はまだ動作しませんPete Beckerが言ったように、入力行全体と次の2つの抽出は失敗しますが、私はここに残します。他の人は同じ試みをしません!!!!!!!
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
struct csvData //creating a structure
{
string username; //creating a vector of strings called username
float gpa; //creating a vector of floats called gpa
int age; //creating a vector of ints called age
};
int main()
{
csvData arrayData[10];
string data;
ifstream infile; //creating object with ifstream
infile.open("datafile.csv"); //opening file
if (!infile.is_open()) { cerr << "File is not opened..\n"; }
int i=0;
while(getline(infile, data))
{
stringstream ss(data);
ss >> arrayData[i].username;
ss >> arrayData[i].gpa;
ss >> arrayData[i].age;
i++;
}
for (int z = 0; z< i; z++)
{
cout<<arrayData[z].username<<arrayData[z].gpa<<arrayData[z].age<<endl;
}
return 0;
}
出力:
C02QT2UBFVH6-lm:~ gsamaras$ g++ -Wall main.cpp
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
username,gpa,age00
Steven,3.2,2000
Will,3.4,1900
Ryan,3.6,1900
Tom,3,1900
しかし、今、それは動作しますが、数分待つが、なぜこの:
while(getline(infile, data));
{
...
}
はしませんでしたか?
ので、ループの後にセミコロンを置くことは、これに相当します
while()
{
;
}
あなたはおそらくすでに一つだけの行でループを知っているように体が必要としないようので、中括弧。
ループの本体(つまり、一部はstd::stringstream
を使用していました)と思ったことは何ですか?
実行されました! しかし一度だけ!。
あなたは、中括弧のペアだけが何かを意味していることが分かります。匿名のスコープ/ブロックです。
ので、この:あなたはあまりにも意図したとおりに
{
stringstream ss(data);
ss >> arrayData[i].username;
ss >> arrayData[i].gpa;
ss >> arrayData[i].age;
i++;
}
は、whileループの一部ではなくて、そのいずれかで機能しました!
なぜそれが機能しましたか?あなたはループの前にi
を宣言していたので! ;)
私は試してきましたが、最初の文字列を解析しようとしていました。これは機能しません:while(getline(infile、data、 '、')) –
ファイル内のすべての値の後にコンマが続くわけではありません。 3番目ごとに改行文字が続きます。そのため、ファイル内に複数の行があります。あなたが見ているように、プログラムはあなたがするべきことを正確に行い、あなたがしたいことはしません。あなたは次のカンマ文字まで読むように言った。それはそれが何をするつもりです。改行がある場合、プログラムは気にしませんが、コンマが見えるまで読み込むように指示されているので、次の行にカンマが表示されるまで読み込みを続け、前の行の最後の値、1つの文字列として。 –
ねえ、私はデータファイルを解析しようとするとかなりのトラブルを抱えています。あなたが私にサンプルコードのヒントを与える方法はありますか?私は今5日間立ち往生しています... –