在C ++中每行读取文本文件,行长未知

时间:2011-10-19 10:15:40

标签: c++

我有一个文本文件,格式有点像这样:

1 3 4 5 6
6 7 8
4 12 16 17 18 19 20
20
0

一行可以包含1到10000个整数。我需要做的是逐行阅读所有这些内容。

像这样的伪代码:

line=0;
i=0;
while(!file.eof()){
 while(!endLine){

 array[0][i++]=file.readChar();
 }
line++;i=0;
}

所以,我有一个数组,我想读取每一行,每一行都包含这些整数。

我遇到的问题是如何检查线路的末端是否已经到来。

注意,我不能使用字符串。

是的,这是作业,但作业的主要任务是建立一个树然后进行转换。我可以这样做,但我不知道如何从文件中读取整数。

4 个答案:

答案 0 :(得分:4)

可能是这样的:

在读取int之后,我手动跳过空格,制表符,回车符和行尾(对于这个,你必须实现你的逻辑)。 要读取int,我使用ifstream的C ++函数直接读取它。我不是逐个字符地读它,然后把它重新组成一个字符串:-) 请注意,我将\r作为“空格。我的行尾为\n

#include <iostream>
#include <fstream>
#include <vector>

int main() 
{
    std::ifstream file("example.txt");

    std::vector<std::vector<int>> ints;

    bool insertNewLine = true;

    int oneInt;

    //The good() here is used to check the status of 
    //the opening of file and for the failures of
    //peek() and read() (used later to skip characters).
    while (file.good() && file >> oneInt)
    {
        if (insertNewLine)
        {
            std::vector<int> vc;
            ints.push_back(vc); 

            //With C++11 you can do this instead of the push_back
            //ints.emplace_back(std::vector<int>());

            insertNewLine = false;
        }

        ints.back().push_back(oneInt);

        std::cout << oneInt << " ";

        int ch;

        while ((ch = file.peek()) != std::char_traits<char>::eof())
        {
            if (ch == ' '|| ch == '\t' || ch == '\r' || ch == '\n')
            {
                char ch2;

                if (!file.read(&ch2, 1))
                {
                    break;
                }

                if (ch == '\n' && !insertNewLine)
                {
                    std::cout << std::endl;
                    insertNewLine = true;
                }
            }
            else
            {
                break;
            }
        }
    }

    //Here we should probably check if we exited for eof (good)
    //or for other file errors (bad! bad! bad!)

    return 0;
}

答案 1 :(得分:2)

有一个名为getline()的函数会读取整行。 Link

答案 2 :(得分:0)

您需要一个函数来从文件中读取值或指示行尾或文件结束条件,如:

result_type GetNextValue (input_file, &value)
{
  if next thing in file is a number, set value and return number_type
  if next thing in file is an end of line, return end_of_line_type
  if end of file found, return end_of_file_type
}

然后你的数组构建循环变为:

line = 0
item = 0
eof = false

while (!eof)
{
  switch (GetNextValue (input_file, value))
  {
  case value_type: 
    array [line][item++] = value

  case end_of_line_type:
    line++;
    item = 0;

  case end_of_file_type:
    eof = true
  }
}

我会把详细信息留给你,因为它是家庭作业。

答案 3 :(得分:0)

您可以读取字符中的数字并检查回车。我刚试过的一个片段如下:

ifstream ifile;  
ifile.open("a.txt");  
char ch;  
while((ch = ifile.get()) != EOF)  
{  
    std::cout<<ch<<"\n";  
    if (ch == '\n')  
        std::cout<<"Got New Line";  
}  
ifile.close();