C++ 在c+中读取文本文件+;

C++ 在c+中读取文本文件+;,c++,text,input,C++,Text,Input,基本上是由制表符分隔的一组整数 问题是程序只读取text.txt文件中的第一个整数,而出于某种原因忽略其余整数。如果我删除整数之间的制表符,它可以正常工作,但是如果它们之间有制表符,它就不能工作。这是什么原因?据我所知,它应该忽略任何空白字符,还是我错了?如果是这样,是否有更好的方法从文本文件中获取这些数字?使用进行读取 1 2 3 4 5 您的程序的行为与您的描述完全相同:inputFile>>数字只提取输入文件中的第一个整数,因此如果您抑制该选项卡,inputFil

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

问题是程序只读取text.txt文件中的第一个整数,而出于某种原因忽略其余整数。如果我删除整数之间的制表符,它可以正常工作,但是如果它们之间有制表符,它就不能工作。这是什么原因?据我所知,它应该忽略任何空白字符,还是我错了?如果是这样,是否有更好的方法从文本文件中获取这些数字?

使用进行读取

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>());