2014-04-14 49 views
0

我的问题可能很琐碎,但我不知道如何处理它。 我有一个程序,从文件中读取矩阵,然后从文件中收集它,显示它并在其上执行数字方法。 当我通过cin插入一些未知数(在这种情况下,它等于文件中的行数),我得到一切正确。 但是,当我尝试从文件读取行数,然后读取矩阵,显示它并执行方法 - 虽然我得到正确的行数,程序读取矩阵,就好像它包含0. 这里是计数行:从文件中读取行数并在C++中使用它的函数

int countLines(ifstream &file){ 
string line; 
int l = 0; 
do{ 
getline(file, line); 
    l++; 
}while(!file.eof()); 
return l;} 

在这里,我尝试使用它:

string nameoffile = ""; 
nameoffile = "Matrix1.txt"; 
    ifstream file; 
    file.open(nameoffile.c_str()); 
    if (file.good()==true) 
    { 
     cout <<"The file is available<<endl; 
     n = countLines(file); 
     cout << n << endl; 
     collectMatrix(file,n); 
    } 
    else 
    { 
     return 0; 
    } 
    displayMatrix(n); 

例如,collectMatrix看起来像这样:

void collectMatrix(ifstream &file, int n){ 
for(int i = 0; i <n; i++) 
{ 
    for(int j = 0; j <n; j++) 
    { 
     file>>A[i][j]; //matrix 
    } 
}  
for(int k=0; k<n; k++) 
{ 
    file>>b[k]; //vector of results 
}   } 

它的所有工作,只要我在代码而不是试图从文件中读取cin >> n。说实话,我必须从文件中读取它,但编程不是很好,所以我会很感激任何提示和帮助。

+0

什么是'plik',应该不是那种善意的'文件'而不是?我没有看到你在哪里设置文件的文件名,甚至打开它......这段代码看起来像一团糟。 – lpapp

回答

1

ifstream在内部跟踪它读取的文件有多远。当你的countLines方法返回时,ifstream已经一直读到文件尾部,并且当你将它传递给collectMatrix时,它仍然保留文件的结尾作为它在文件中的当前位置。当你尝试填充矩阵时,没有什么需要从文件中读取,所以矩阵值没有设置。

你有几个选择来解决这个问题。首先是在填充值时计算矩阵的大小。你的代码似乎表明矩阵是方形的;如果是这样,您可以通过查看第一行来确定矩阵的大小。另一个更简单但效率更低的方法是只创建第二个具有相同文件的ifstream并将其传递给collectMatrix。这种方法会相当缓慢,因为您通过文件两次。

+0

感谢您的解释,我现在明白了;) – user3533543

相关问题