2016-03-22 6 views
2

Excelシートを読み込んでCファイルの変数に値を割り当てる必要があります。私はコードを書いたが、forループを使用しているので最後の変数だけが値を割り当てられている。値を割り当てた後に別の出力ファイルを作成しているので、前の変数に割り当てられた値を上書きしている。Excelシートを読み込んでcファイルの変数に値を代入する

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

using namespace std; 

int main() 
{ 
string s1, s2, s3,s4; 
string filename, text, line; 
string cfilename,funcname, signal, value; 

    int i , k , m; 
cout << "Enter excel filename" << endl; 
cin >> filename; 
cout << "How many lines of text are in the file?" << endl; 
cin >> m; 
fstream file(filename); 
if (!file) { 
      cerr << "No such file exists." << endl; 
      exit(1); 
      } 
if (file.is_open()) { 

     while (file.eof()==0){ 

      for (k = 0; k < m; k++) {        //Loops for as many lines as there are in the file 

       for (i = 0; i < 4; i++) {       //Loops for each comma-separated word in the line 


        if (i == 0){ 
         getline(file, text, ',');   
         cfilename=text; 
        cout << cfilename << '\t';} 

        else if (i == 1){ 
         getline(file, text, ','); 
         funcname=text; 
        cout << funcname << '\t';} 

        else if (i == 2){ 
         getline(file, text, ','); 
         signal=text; 
        cout << signal << '\t';} 

        else if (i == 3){ 
         getline(file, text, '\n'); 
         value=text; 
        cout << value << '\n';} 

             } 

            string s1=signal,s2=value;   

            s2 = s2 + "; //"; 

            int offset, inset; 

            string line; 

            string search=s1; 

            fstream cfile(cfilename); 

            fstream fileOutput; 

            fileOutput.open("output.c"); 

            if(cfile.is_open() && fileOutput.is_open()) { 


                     while(!cfile.eof()) { 

                      getline(cfile, line); 

                      if ((offset = line.find(funcname)) != string::npos){ 

                         cout << "found: " << funcname << endl;      

                         string line1; 

                         fileOutput << line << '\n'; 

                         skip: 

                         while(getline(cfile,line1)){ 


                          if((inset=line1.find(search, 0)) !=string::npos){ 

                           cout<<"found: " << search << endl; 

                           string s3 = s1+ "=" +s2; 

                           //cout<<s3; 

                           line1.replace(inset, inset+s1.size(), s3);} 


                          fileOutput << line1 << '\n'; 

                          goto skip; 

                          } 

                         getchar(); } 

                      fileOutput << line << '\n'; } 

                    cfile.close(); 
                    fileOutput.close(); 
                    } 
             } 
            } 
          } 
        file.close(); 
        getchar(); 
        return 0; 
} 

私は最初に関数を検索してからその関数内の変数を検索しようとしています。

こちらのヘルプが必要です。

+0

すでに投稿に回答しているようだ。http://stackoverflow.com/questions/3230706/read-from-excel-file-in-c – nyemul

+0

実際には、私はCファイルの変数に値を代入する際に問題があります。上記のリンクは、Excelファイルから値を読み取る方法を扱っています。 –

答えて

0

私はこれが問題だとは確信していませんが...私は事物while()が多すぎます。

あなたは、ファイルの末尾を越えて何も読んでいないしていないので、あなたが、本当のあなたの

while (file.eof()==0) 

結果をファイルのm行をreadedています。

他のm行(読み込みに失敗したが失敗しましたが、読み込みが成功しなかったこと)があります。

EDIT:私はあなたがプログラムは、あなたがそれを求めて正確に何をすべきかん

cout << "Enter excel filename" << endl; 
cin >> filename; 
fstream file(filename); 
if (!file) { 
    cerr << "No such file exists." << endl; 
    exit(1); 
} 
while ( getline(file, cfilename, ',') && getline(file, funcname, ',') 
     && getline(file, signal, ',') && getline(file, value, '\n')) { 
    cout << cfilename << '\t' << funcname << '\t' << signal << '\t' 
     << value << '\n'; 

    string s1=signal,s2=value; 
    [...] 
+0

私は変更を行いましたが、出力はまったく同じでした。 csvの各行の出力ファイル全体を書くのを避ける方法を教えてください。私はちょうど私が文字列を置き換えるポイントから続行したいです。 –

+0

わかりません。あなたがしたいのは、csvファイルの最初の行のeleborareだけですか? – max66

+0

いいえ。私のcsvファイルには、さまざまな変数と各行に対応する値が含まれています。変数とその値を検索して出力ファイルに書き込んで、出力ファイルの変数に値を持たせたいとします。しかし、上のコードは、csvファイルの1行分の出力ファイル全体を上書きします。つまり、1つの変数にのみ値が割り当てられます。しかし、私はすべての値を変数に代入したい。 Plzのヘルプ –

0

ような何か書くべきだと思う:あなたはCSVファイルを読み込む

  • を(Excel形式はバイナリです!)ラインCSVファイル内の各行について
  • ラインによって:
    • あなた消去出力ファイルは、ソースファイル内の何かを検索し、出力ファイルに書き込むことを指定しないでfstreamを開くためです。ios::ate

あなたが入力CSVファイルからのすべての新しい行で出力ファイルを消去すると、あなたは最後の操作よりも多くを得ることができません。

ループ外で出力ファイルを開いた方がずっと簡単です。

... while (file.eof() == 0)はアンチパターンです。ファイルの最後に、の前に行が読み込まれているかどうかを調べ、最初のgetlineがeofフラグを設定したときに4つの値を読み込みます。読んだ直後ではなく、直後にeofをテストしなければならない。

+0

ああ問題が私は直面しているthats。上記のコードで、csvの各行のファイル全体を書き直すのを避ける方法を教えてください。また、私は上記のコードでios :: ateを使ってみましたが、動作しませんでした。どうすればいいですか? –

+0

そして、私がfstreamで出力ファイルを作成しようとすると、ファイルを作成したり書き込んだりしません。出力ファイルを作成するが、何も書いていないofstreamを使ってファイルを作成しなければならないだろうし、ファイルに書き込む次の実行でコマンドをfstreamに変更する。これに対する解決策はありますか? –

関連する問題