2014-11-05 49 views
-2

我附上了我的程序的完整源代碼,可以打開.txt文件。它不會在cout << length之後執行。我試圖通過使用一個數組來將.txt文件信息存儲在內存中。爲什麼下一行不能執行C++

#include <iostream> 
#include <string.h> 
#include <fstream> 
using namespace std; 

char filename[128]; 
char file[10][250]; 
int count; 
int length; 
string line; 

int main() 
{ 
    int count = 0; 
    int length = 0; 
    cout << "Filename: "; 
    cin.clear(); 
    cin.getline(filename, sizeof(filename)); 
    string new_inputfile(filename); 
    ifstream inputfiles (new_inputfile.c_str()); 
    if(!inputfiles.is_open()) 
    { 
     cout << "File could not be opened. \n "; 
    } 
    else 
    { 
     for (int i=0; getline(inputfiles,line); i++) 
     { 
      length++; 
     } 

     cout << length; 
//  char file[length][250]; <- How can I create the array based on the length variable? 
// CODE DOES NOT EXECUTE AFTER THIS. 
     while(!inputfiles.eof() && (count<10)) 
     { 
      inputfiles.getline(file[count],250); 
      count++; 
     } 

     for(int i=0; i < count; i++) 
     { 
      cout << file[i] << endl; 
     } 

    } 
    inputfiles.close(); 
    return 0; 
} 

而且,由於file[]是char,比方說file[1]包含的字符Name=Mike,我怎麼脫光=之前的一切。我只想要Mike。我知道用string,我可以用substr()的方法,但我不知道用於char

+0

爲什麼不直接使用'getline(cin,new_inputfile);'直接跳過中間人? – 2014-11-05 21:08:11

+0

文件不是'char',它是一個'char數組'差別很大。 – deW1 2014-11-05 21:09:56

+0

@NeilKirk你是什麼意思?我在哪裏放置getline(cin,new_inputfile)'? – user4167396 2014-11-05 21:10:21

回答

3

這是非常浪費的方式來計算文件中的行數。

for (int i=0; getline(inputfiles,line); i++) // i is also completely useless here 
{ 
    length++; 
} 

您正在閱讀整個文件只是爲了拋開一切,重新開始!此循環完成後,inputfiles.eof()將爲true,並且您將永遠不會輸入下一個while循環,也不會輸入最後的for循環(因爲i == count)。執行直接跳到inputfiles.close(),然後從main返回。

,我建議你在line字符串工作,當您去:

for (; getline(inputfiles, line);) 
{ 
    // do stuff with line and ditch the global char arrays 
} 

如果你想存儲供以後的線路,那麼,就拯救他們:)來最容易的事情就是用一個vector

std::vector<std::string> all_them_lines; 
while (getline(file, line) all_them_lines.emplace_back(line); 

在那裏,整個文件現在由線保存在all_them_lines,行。你可以像訪問數組一樣訪問它們,如all_them_lines[0]。你也不需要事先知道行數 - 當你向他們添加東西時矢量會自動擴展。

現在解析一行並從中提取格式化的輸入,看看stringstream class必須提供什麼。

+0

謝謝。所以我如何保存這條線?我聽說你可以不用數組。就像我的'txt'文件中的第一行是'Name = Mike',我想將'name'變量設置爲'Mike'。我的第二行是'Age = 10',我想將我的'age'變量設置爲10 – user4167396 2014-11-05 21:15:29

+0

@ user4167396我稍微擴展了答案。 – jrok 2014-11-05 21:20:43

+0

謝謝:)。是否有讀取文件的方式,不是存儲行,而是將行存儲到變量中。例如,如果我的'txt'文件中的第一行是'Name = Mike',並且我想將'name'變量設置爲'Mike'。我的第二行是'年齡= 10',我想將我的'age'變量設置爲'10'。我打算創建一個'setName'和'setAge'方法來存儲行 – user4167396 2014-11-05 21:27:39

-1

你問:

//  char file[length][250]; <- How can I create the array based on the length variable? 

聲明file爲:

char (*file)[250] = NULL; 

然後,

file = new char[length][250]; 

確保您的年底之前調用delete [] file功能。

你說:

// CODE DOES NOT EXECUTE AFTER THIS. 

您可以rewind the stream,並開始從它再次閱讀。

inputfiles.seekg(0); 
    count = 0; 
    while(!inputfiles.eof()) 
    { 
     inputfiles.getline(file[count],250); 
     count++; 
    } 
+0

-1,使用向量或其他容器而不是新/刪除 – 2014-11-05 21:37:34

+0

@MattMcNabb,我很欣賞評論。回答OP的問題對我來說更有意義,而不是建議一種不同但更好的方法。有時我確實提出了一種不同的方法。對於這個問題,我覺得回答這個問題更有意義。 – 2014-11-05 21:46:07

+0

我不確定你是什麼意思的「點」。 'char file [length] [250]'是非法的,必須由一些合法代碼替換。 – 2014-11-05 22:00:16