如何从文件c ++中读取每一行

时间:2014-02-21 20:09:11

标签: c++ file

我有两个问题。我试图从文件中逐行读取,但我不能让每一行单独去我可以使用的地方。此外,我无法弄清楚如何询问用户他们的文件名,而不是使用他们在程序中键入的内容。我发现的所有示例中都只有代码中的文件名,只是把它放在cin中似乎不起作用。我试图将两种不同类型的行分开,例如,abcd和1234.如果第一个值是一个字母,请做一个案例a,如果是一个数字,请做b。但我设法做的就是让getline将所有内容集中在一起,这样我就无法将其分开。有人有任何建议吗?

string x;
cout << "Enter your file: " ;
cin >> x
string line;
ifstream myfile;
myfile.open (x);
while(!myfile.eof())
{
    getline(myfile,line, ' ');
}
cout << line << endl;

2 个答案:

答案 0 :(得分:3)

用于读取文件名的cin语句没有任何问题。只要该文件存在,您拥有的将打开该文件。但是,您可以添加一些错误检查:

std::string x;
std::cout << "Enter your file: " ;
if (!(std::cin >> x))
{
    std::cerr << "Invalid input!" << std::endl;
    return -1;
}

std::ifstream myfile(x);
if (myfile.is_open())
{
    std::string line;
    while (myfile >> line)
    {
        std::cout << line << std::endl;
    }
}
else
{
    std::cerr << "Unable to open file:  " << x << std::endl;
    return -1;
}

请注意正确的while条件(不要对eof() std::istream条件使用while!)。此外,如果您要在空格上分隔,则无需使用std::getline - operator>>也可以执行相同的操作。

如果你想根据line的值做不同的事情,那么检查字符串。例如:

if (line[0] >= '0' && line[0] <= '9')
    // do something with digits
else
    // do something with non-digits

答案 1 :(得分:1)

首先,不要将eof()置于while条件下。这是错误的,因为iostream::eof只会在读取流结束后设置。它并不表示下一次读取将是流的结束。看看这篇文章:Why is iostream::eof inside a loop condition considered wrong?

要分开,您可以检查该行的第一个char是否在['0', '9']内。

像这样:

while( getline(myfile, line) )
{
    if (line[0]>='0' && line[0]<='9')
    {
        // start with a number (do case b)
    }
    else
    {
        // other (do case a)
    }
}