为什么下一行不执行C ++

时间:2014-11-05 21:00:25

标签: c++ arrays char ifstream

我附上了我的程序的完整源代码,可以打开.txt文件。它不会在cout << length之后执行。我试图通过使用数组将.txt文件信息存储在内存中。

#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]包含char Name=Mike,如何在=之前删除所有内容。我想要Mike。我知道使用string,我可以使用substr()方法,但我不知道char

2 个答案:

答案 0 :(得分:3)

这是计算文件中行数的非常浪费的方法。

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

您正在阅读整个文件只是扔掉所有东西然后重新开始!完成此循环后,inputfiles.eof()将为true并且您永远不会同时输入下一个while循环和最后一个for循环(因为{{1} }})。执行会直接跳至i == count,然后您从inputfiles.close()返回。

我建议您在使用main字符串时处理:

line

如果你想稍后存储这些行,那么只需保存它们:)最简单的方法是使用vector

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

在那里,整个文件现在逐行保存在std::vector<std::string> all_them_lines; while (getline(file, line) all_them_lines.emplace_back(line); 中。您可以像在all_them_lines中一样访问它们。您也不需要事先了解行数 - 当您向其中添加内容时,向量会自动展开。

现在要解析一行并从中提取格式化的输入,请查看stringstream class提供的内容。

答案 1 :(得分:-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++;
    }