2010-05-02 296 views
0

我正在写一个练习的程序,它将读取文件中的数据并将其格式化为可读。到目前为止,我有一些代码会将头部与其下的数据分开。那就是:为什么不执行for循环?

int main() { 
    ifstream in("records.txt"); 
    ofstream out("formatted_records.txt"); 
    vector<string> temp; 
    vector<string> headers; 
    for (int i = 0; getline(in,temp[i]); ++i) { 
     static int k = -1; 
     if (str_isalpha(temp[i])) { 
      headers[++k] = temp[i]; 
      temp.erase(temp.begin() + i); 
     } 
     else { 
      temp[i] += "," + headers[k]; 
     } 
    } 
} 

str_isalpha()只是适用isalpha()在一个字符串中的每个字符的功能)现在,for循环在这个程序不执行,我想不通为什么。有人知道吗?

编辑:至于建议,我把它改成

string line; 
for (int i = 0; getline(in,line); ++i) { 
    temp.push_back(line); 

不过跳过for循环干脆。

+0

是getline参数中的逗号吗? – Holograham 2010-05-02 01:22:13

+0

是的,这就是参数如何在函数中分离,不是吗? – Maulrus 2010-05-02 01:34:10

回答

4

如果在确保您正在读入有效的字符串引用之后循环仍然不运行,那么您应该检查您正在读取的流是否有效。例如,如果该文件不存在或者您没有权限读取该文件流,该流将无效。当流无效时,getline将不会读取任何内容。它的返回值是相同的流,当转换为bool时,它的计算结果为false。在继续之前检查流的状态。

ifstream in("records.txt"); 
if (!in.is_open()) { 
    std::cerr << "Uh-oh.\n"; 
    return EXIT_FAILURE; 
} 
+0

谢谢,这原来是问题所在。 – Maulrus 2010-05-02 01:46:32

5

vector<string> temp;作出载体。当您尝试读入temp[0]时,这是未定义的行为。你应该先通过getline的第二个参数一个单独的string变量,比如string foo;之前的循环,然后temp.push_back(foo);作为循环体中的第一条指令。