C++ 在c+中读取文本文件+;
基本上是由制表符分隔的一组整数 问题是程序只读取text.txt文件中的第一个整数,而出于某种原因忽略其余整数。如果我删除整数之间的制表符,它可以正常工作,但是如果它们之间有制表符,它就不能工作。这是什么原因?据我所知,它应该忽略任何空白字符,还是我错了?如果是这样,是否有更好的方法从文本文件中获取这些数字?使用进行读取C++ 在c+中读取文本文件+;,c++,text,input,C++,Text,Input,基本上是由制表符分隔的一组整数 问题是程序只读取text.txt文件中的第一个整数,而出于某种原因忽略其余整数。如果我删除整数之间的制表符,它可以正常工作,但是如果它们之间有制表符,它就不能工作。这是什么原因?据我所知,它应该忽略任何空白字符,还是我错了?如果是这样,是否有更好的方法从文本文件中获取这些数字?使用进行读取 1 2 3 4 5 您的程序的行为与您的描述完全相同:inputFile>>数字只提取输入文件中的第一个整数,因此如果您抑制该选项卡,inputFil
1 2 3 4 5
您的程序的行为与您的描述完全相同:
inputFile>>数字
只提取输入文件中的第一个整数,因此如果您抑制该选项卡,inputFile>
将提取数字12345
,而不是5个数字[1,2,3,4,5]
更好的方法是:
string numbers;
if (inputFile.is_open())//checking if open
{
getline (inputFile,numbers); //fetches entire line into string numbers
inputFile.close();
}
vector数字;
字符串fileName=“text.txt”;
ifstream输入文件;
open(fileName.c_str(),ios_base::in);
字符c;
while(inputFile.good())//可以从文件提取时循环
{
c=inputFile.get();//从文件中获取字符
如果(in PosiFr.Goad)和C!=‘t’和C!=’’/ /不确定C++中的制表符和空间编码
{
数字。推回((int)c);
}
}
inputFile.close();
在读取格式化字符串时,输入运算符以忽略前导空格开始。然后它读取非空白字符直到第一个空格,然后停止。非空白字符存储在std::string
中。如果在流到达文件末尾之前只有空格字符(或者有错误),读取将失败。因此,您的程序读取一个“单词”(在本例中为数字)并停止读取
不幸的是,您只说了您正在做什么以及您的方法存在哪些问题(您的问题描述没有涵盖读取输入失败的情况)。以下是一些您可能想要尝试的事情:
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();
如果你想读多行,你应该把这个操作放到一个循环中:不幸的是,没有像读单词那样读一系列行的方法std::getline()
,但需要知道文件中没有的一个字符值,例如空值:
if (std::getline(inputFile, line)) { ... }
这种方法将“行”视为一个字符序列,最多为一个空字符。您也可以使用任何其他字符值。如果您不能确定字符值,可以使用std::string
的构造函数(使用迭代器)读取整个文件:
if (std::getline(inputFile, text, char()) { ... }
std::字符串文本((std::istreambuf_迭代器(inputFile)),
std::istreambuf_迭代器();
注意,不幸的是,第一个参数周围的附加括号是必要的(如果使用C++ 2011,可以用括号来代替它们,而不是括号)。
它只忽略字符前面的空白。如果希望包含空格,请使用
std::getline
。如果你想把它们作为数字,一个std::vector(std::istream\u迭代器(inputFile),std::istream\u迭代器())就可以了。我尝试过使用它,但这次它玩的是一个与我的文本文件不同的字符串聚会。我的文本文件是35 2 13 4 6 7 1 7 5 13 12 2 7 12 3 1 4 5 1 10 5 1 14 4 1 7 2 4 9 17 5 6 2 7 21 8 1 17 32 8 5 4 1 4 3 34 7 6 85 2 20 6 13 6 72 2 1 97 3 1 9 5 48 1 8 3 34 16 1 192 4 6 2 5 2 12 3 3 3 4 219 5 12 53 8 73 4 14 8 22,我得到的是12 53 87 46 14 792 819 22似乎是文本文件的最后一部分,但有点不同。问题是,当我使用上面提到的方法,使用字符串构造函数读取整个文件时,我使用的字符串似乎太小,无法包含所有100个数字。它只包含集合的最后19个数字。我在尝试使用getLine()方法时也遇到了这个问题。据我记忆所及,字符串在需要时会自动调整大小,但这似乎对我不起作用。构造函数肯定会读取整个文件!我甚至想不出一个合理的理由来只读取输入的尾部!你能展示你在做什么吗?ifstream inputFile(“text.txt”);字符串s((istreambuf_迭代器(inputFile)),istreambuf_迭代器();我尝试过这个,但很明显,我的问题是由于我的IDE中的一个错误。它可以捕获整行并将其放入一个字符串中,没有问题,但当它显示字符串时,问题就会出现。我的IDE(netbeans)输出面板能够显示一定大小的字符串。在打印包含这些数字的字符串之前,如果我使用cout打印其他内容,它们只是相互重叠,而不是继续新的一行。
if (std::getline(inputFile, line)) { ... }
if (std::getline(inputFile, text, char()) { ... }
std::string text((std::istreambuf_iterator<char>(inputFile)),
std::istreambuf_iterator<char>());