2016-03-22 5 views
2

Мне нужно присвоить значения переменным в файле C, прочитав лист excel. Я написал код, но только последняя переменная была назначена значение, так как я использовал для цикла. Это перезаписывает значения, назначенные предыдущим переменным, поскольку я создаю другой выходной файл после назначения значений.Присвоить значения переменным в файле c путем чтения листа excel

#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() слишком много.

когда вы в m прочитанные строки файла, ваш

while (file.eof()==0) 

результат верно, потому что вы никогда не читали ничего мимо конца файла.

Таким образом, вы читаете другие строки 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? – max66

+0

№. Мой файл csv содержит разные переменные и соответствующие значения в каждой строке.Я хочу найти переменные и их значения и записать их в выходной файл, чтобы переменные в выходном файле имели значения. Но мой код выше перезаписывает весь выходной файл для 1 строки в csv-файле i.e, только 1 переменной присваивается значение. но я хочу, чтобы все значения были присвоены переменным. Справка Plz –

0

Программа делает именно то, что вы попросили его сделать:

  • прочитать файл CSV (формат Excel является бинарной!) Линии по линии
  • для каждой строки в CSV-файл:
    • вы стереть выходного файла, потому что вы открываете fstream без указания ios::ate
    • искать что-то в исходном файле и записывать в выходной файл.

Как удалить выходной файл на каждой новой строки из входного файла CSV, вы не можете получить больше, чем последней операции.

Было бы намного проще, если бы вы открыли выходной файл за пределами цикла.

И ... while (file.eof() == 0) - это анти-шаблон. Вы посмотрите, достигли ли вы конца файла до, пытаясь прочитать строку, а затем прочитайте 4 значения, когда первая линия getline установила флаг eof. Вы должны проверить для eof сразу после чтения, а не раньше ...

+0

Я рассматриваю проблему iam. Могу ли вы рассказать мне, как избежать перезаписи всего файла для каждой строки в csv в приведенном выше коде. Кроме того, я попытался использовать ios :: ate в приведенном выше коде, но не работал. Как я могу это сделать? –

+0

И когда я пытаюсь создать выходной файл с помощью fstream, он не создает и не записывает в файл. Мне нужно создать файл, используя streamstream, который создает выходной файл, но ничего не пишет, а затем измените команду на fstream в следующем выполнении, чтобы записать в файл. Любое решение для этого? –

Смежные вопросы