用c ++读取文本文件

时间:2012-10-27 16:56:47

标签: c++ text input

string numbers;
string fileName = "text.txt";


ifstream inputFile;
inputFile.open(fileName.c_str(),ios_base::in);
inputFile >> numbers;
inputFile.close();
cout << numbers;

我的text.txt文件是:

1    2    3    4    5

基本上是一组由制表符分隔的整数。

问题是程序只读取text.txt文件中的第一个整数,并由于某种原因忽略其余的整数。如果我删除整数之间的选项卡它工作正常,但它们之间有标签,它将无法正常工作。是什么导致这个?据我所知它应该忽略任何空白字符或我错了?如果有,是否有更好的方法从文本文件中获取每个数字?

3 个答案:

答案 0 :(得分:2)

使用 getline 进行阅读。

string numbers;
if (inputFile.is_open())//checking if open
{
      getline (inputFile,numbers); //fetches entire line into string numbers
      inputFile.close();
}

答案 1 :(得分:2)

当读取格式化字符串时,输入操作符以忽略前导空格开始。然后它读取非空白字符直到第一个空格并停止。非空白字符存储在std::string中。如果在流到达文件末尾之前只有空格字符(或者某些错误),则读取失败。因此,您的程序会读取一个“单词”(在本例中为数字)并停止阅读。

不幸的是,你只是说你正在做什么以及你的方法存在什么问题(你的问题描述无法涵盖首先读取输入失败的情况)。以下是您可能想要尝试的一些事项:

  1. 如果您想阅读多个单词,可以这样做,例如,阅读所有单词:

    std::vector<std::string> words;
    std::copy(std::istream_iterator<std::string>(inputFile),
              std::istream_iterator<std::string>(),
              std::back_inserter(words));
    

    这将读取inputFile中的所有字词,并将其存储为向量std::string中的words s序列。由于您的文件包含数字,因此您可能希望将std::string替换为int,以便以易于访问的形式读取数字。

  2. 如果您想阅读一行而不是单词,则可以使用std::getline()代替:

    if (std::getline(inputFile, line)) { ... }
    

    如果你想读取多行,你就把这个操作放到一个循环中:遗憾的是,没有读取方法来读取一系列行,就像有文字一样。

  3. 如果您想要将整个文件(而不仅仅是第一行)读入文件,您还可以使用std::getline(),但您需要了解一个不会发生的字符值在您的文件中,例如,空值:

    if (std::getline(inputFile, text, char()) { ... }
    

    此方法将“行”视为一个字符序列,最多为空字符。您也可以使用任何其他字符值。如果您无法确定字符值,可以使用std::string的构造函数读取整个文件,并使用迭代器:

    std::string text((std::istreambuf_iterator<char>(inputFile)),
                     std::istreambuf_iterator<char>());
    

    请注意,遗憾的是,第一个参数周围的额外括号对是必要的(如果您使用的是C ++ 2011,则可以使用大括号而不是括号来避免它们。)

答案 2 :(得分:-1)

您的程序的行为与描述完全相同:inputFile >> numbers;只提取输入文件中的第一个整数,因此如果您取消选项卡,inputFile>>将提取数字12345,不是5个数字[1,2,3,4,5]

更好的方法:

vector< int > numbers;
string fileName = "text.txt";
ifstream inputFile;
inputFile.open(fileName.c_str(),ios_base::in);
char c;
while (inputFile.good())     // loop while extraction from file is possible
{
    c = inputFile.get();       // get character from file
    if ( inputFile.good() and c!= '\t' and c!=' ' ) // not sure of tab and space encoding in C++
    {
      numbers.push_back( (int) c);
    }
}
inputFile.close();