从文件中读取数字

Posted

技术标签:

【中文标题】从文件中读取数字【英文标题】:Reading Numbers from a File 【发布时间】:2012-07-31 01:17:58 【问题描述】:

我有一个包含很多数字的文件。该文件基本上看起来像“192 158 100 0 20 200”。如何一次加载文件编号 1 并在 C++ 中将它们显示在屏幕上?

【问题讨论】:

要获得漂亮、精美的单行字(至少对于阅读和打印部分),请查看std::copystd::istream_iteratorstd::ostream_iterator 【参考方案1】:

试试这样的:

int val;
std::ifstream file("file");
while (file >> val)        
    std::cout << val;

【讨论】:

那会一一读取每个数字吗?还是只是将整个文件打印到屏幕上? 哦,我明白了。因此,例如数字“142”读作“1”“4”和“2”。对吗? 好吧,每一步 val 都会保持完整的数字。因此,如果文件具有“142 135 20”,则 val 将具有以下值 142 135 20。但是,无论如何,您将编写此程序,该文件将在内部逐字节读取。 一个完整的数字?好吧,这是做什么的?它是否将“142 158 195”的文件读取为“142”,然后重置并转到“158”,然后转到“195”,还是转到“1”“4”“2”等等??跨度> 也是错的。文件中的最后一个数字将被打印两次。您实际上不应该使用while(EOF TEST),因为仅在您读取文件末尾并且最后一次成功读取读取到(但不超过 EOF)之后才设置 EOF 标志。循环应该是while(file &gt;&gt; val) 这样如果读取成功,循环就进入了。【参考方案2】:

下面的程序应该打印每个数字,每行一个:

#include <iostream>
#include <fstream>

int main (int argc, char *argv[]) 
    std::ifstream ifs(argv[1]);
    int number;

    while (ifs >> number) 
       std::cout << number << std::endl;
    

【讨论】:

失败:最后一次成功读取不会将流设置为错误。因此,您进入 while 循环,ifs &gt;&gt; number 可能会失败。标准模式是while(ifs &gt;&gt; number),因此如果失败,则不会进入循环。目前,您将两次打印文件中的最后一个值。【参考方案3】:
#include <iostream>
#include <iterator>
#include <sstream>
#include <vector>

int main() 
    std::ifstream fs("yourfile.txt");
    if (!fs.is_open()) 
        return -1;
    

    // collect values
    // std::vector<int> values;
    // while (!fs.eof()) 
    //    int v;
    //    fs >> v;
    //    values.push_back(v);
    // 
    int v;
    std::vector<int> values;
    while (fs >> v) 
        values.push_back(v);
    
    fs.close();    

    // print it
    std::copy(values.begin(), values.end(), std::ostream_iterator<int>(std::cout, " "));

    return 0;

【讨论】:

那是失败的。几乎从不做while(EOF Test) 这几乎总是错误的。问题是在您阅读 EOF 之前,EOF 不是真的。因此,最后一个数字将读取到(但不会超过 EOF)。然后循环内的读取将失败,您将随机值推送到values。你应该做的是while(fs &gt;&gt; v)。并非所有语言都适用这种模式,而不仅仅是 C++。 注意:为什么不使用 copy() 从输入复制到输出。不需要中间存储。【参考方案4】:

请考虑以下代码:

    ifstream myReadFile;
    myReadFile.open("text.txt");
    int output;
    if (myReadFile.is_open())
    
        while (fs >> output)    
            cout<<output;
        
    

//Of course closing the file at the end.
myReadFile.close();

同样,在使用上述示例时,请在代码中包含 iostream 和 fstream。

请注意,您需要开始打开一个文件流进行读取,您可以尝试逐个字符地读取它,并检测它之间是否有任何空白。

祝你好运。

【讨论】:

这到底是做什么的?我的猜测是它正在逐个字符地阅读?我能做到。我想知道如何逐个阅读。 那么你可能想看看这篇文章:***.com/questions/5005317/c-read-line-of-numbers 那是失败的。几乎永远不要这样做,而(EOF 测试)几乎总是错误的。问题是在您阅读 EOF 之前,EOF 不是真的。因此,最后一个数字将读取到(但不会超过 EOF)。然后循环内的读取将打印最后一个值两次。你应该做的是while(fs >> v)。并非所有语言都适用这种模式,而不仅仅是 C++。 查看我的 cmets 以明确使用 close。 codereview.stackexchange.com/q/540/507【参考方案5】:

另一种方法:

std::string filename = "yourfilename";

//If I remember well, in C++11 you don't need the
//conversion to C-style (char[]) string.
std::ifstream ifs( filename.c_str() );


//Can be replaced by ifs.good(). See below.
if( ifs ) 
    int value;

    //Read first before the loop so the value isn't processed
    //without being initialized if the file is empty.
    ifs >> value;

    //Can be replaced by while( ifs) but it's not obvious to everyone
    //that an std::istream is implicitly cast to a boolean.
    while( ifs.good() )  
        std::cout << value << std::endl;
        ifs >> value;       
    
    ifs.close();
 else 
    //The file couldn't be opened.

错误处理可以通过多种方式完成。

【讨论】:

有效。但标准模式是:while(ifs &gt;&gt; value)。这也使代码更加简洁。您正在使用 if (ifs)while(ifs.good()) 需要在使用上保持一致。就我个人而言,我什至不会测试(除非您报告错误)。无需显式关闭 RAII 将正确关闭它codereview.stackexchange.com/q/540/507 @Loki 抱歉缺乏一致性,我在最后一分钟更改了 while,所以我忘记了 if。感谢 RAII 技巧,我不知道析构函数正在关闭流(这似乎完全正常)。

以上是关于从文件中读取数字的主要内容,如果未能解决你的问题,请参考以下文章

如下:为啥C语言读取文件中的数据并输出时有乱码出现?本来输入的是数字,然后从文件中读取后就变汉字

在从文件读取的字母数字数组中查找数字元素并将它们写入新文件

从文件中读取数字

程序正在从文件中读取最大的数字,但不是最小的

C语言从TXT文档中读取一组数字时如何判断已经读到最后一个数字?

如何从 ASCII 文件中读取数字 (C++)