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文件中的第一个整数,并由于某种原因忽略其余的整数。如果我删除整数之间的选项卡它工作正常,但它们之间有标签,它将无法正常工作。是什么导致这个?据我所知它应该忽略任何空白字符或我错了?如果有,是否有更好的方法从文本文件中获取每个数字?
答案 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
中。如果在流到达文件末尾之前只有空格字符(或者某些错误),则读取失败。因此,您的程序会读取一个“单词”(在本例中为数字)并停止阅读。
不幸的是,你只是说你正在做什么以及你的方法存在什么问题(你的问题描述无法涵盖首先读取输入失败的情况)。以下是您可能想要尝试的一些事项:
如果您想阅读多个单词,可以这样做,例如,阅读所有单词:
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
,以便以易于访问的形式读取数字。
如果您想阅读一行而不是单词,则可以使用std::getline()
代替:
if (std::getline(inputFile, line)) { ... }
如果你想读取多行,你就把这个操作放到一个循环中:遗憾的是,没有读取方法来读取一系列行,就像有文字一样。
如果您想要将整个文件(而不仅仅是第一行)读入文件,您还可以使用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();