1
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 文件中的第一个整数,而由于某种原因忽略了其余的整数。如果我删除整数之间的制表符,它可以正常工作,但是它们之间有制表符,它将不起作用。这是什么原因造成的?据我所知,它应该忽略任何空白字符还是我弄错了?如果是这样,有没有更好的方法从文本文件中获取这些数字中的每一个?

4

3 回答 3

2

使用getline进行阅读。

string numbers;
if (inputFile.is_open())//checking if open
{
      getline (inputFile,numbers); //fetches entire line into string numbers
      inputFile.close();
}
于 2012-10-27T16:59:29.720 回答
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::strings 的序列存储在 vector 中words。由于您的文件包含数字,您可能希望替换std::stringint以易于访问的形式读取数字。

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

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

    如果你想读取多行,你可以把这个操作放到一个循环中:不幸的是,没有像单词那样读取一系列行的read-made方法。

  3. 如果您想将整个文件(而不仅仅是第一行)读入文件中,您也可以使用std::getline(),但您需要知道文件中没有出现的一个字符值,例如 null 值:

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

    这种方法将“行”视为一个字符序列,直到一个空字符。您也可以使用任何其他字符值。如果您不能确定字符值,您可以使用带有std::string迭代器的构造函数读取整个文件:

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

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

于 2012-10-27T18:33:40.393 回答
-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();
于 2012-10-27T17:14:27.480 回答