使用fstream从C ++中的* .txt文件中读取数字

时间:2012-03-27 00:44:25

标签: c++ visual-c++ file-io fstream ifstream

我有一个* .txt文件有整数,每行一个。所以文件看起来像

103123
324
4235345
23423
235346
2343455
234
2
2432

我试图逐行从文件中读取这些值,因此我可以将它们放在一个数组中。下面是我为实现这一目标而编写的一些代码

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int nArray[1000];
int i = 0;

int _tmain(int argc, _TCHAR* argv[])
{
    ifstream file("C:\Users\Chinmay\Documents\Array.txt");
    //fstream file("C:\Users\Chinmay\Documents\Array.txt", ios_base::out );
    //fstream file();
    //file.open("C:\Users\Chinmay\Documents\Array.txt", ios_base::out );

        bool b = file.is_open();
    //file.seekg (0, ios::beg);
    int i = file.tellg();
    while(!file.eof())
    {
        //string str;
        //getline(file, str);
                //nArray[i++] = atoi(str.c_str());
        char str[7] = {};
        file.getline(str,7);
        nArray[i++] = atoi(str);
    }
    file.close();
    return 0;
}

文件打开,因为bool'b'返回true。但是while循环在一次运行中退出。并且数组是空的。我在网上查了一下,尝试了其他的东西,比如这里给出的代码

code tutorial

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int nArray[100000];
int i = 0;

int _tmain(int argc, _TCHAR* argv[])
{
    ifstream in("C:\Users\Chinmay\Documents\Array.txt");
    bool b = in.is_open();

  if(!in) {
    cout << "Cannot open input file.\n";
    return 1;
  }

  char str[255];

  while(in) {
    in.getline(str, 255);  // delim defaults to '\n'
    if(in) cout << str << endl;
  }

  in.close();

  return 0;

}

这也会立即返回。该文件打开但没有数据被读取。该文件不为空并且包含数据。有人可以解释我哪里错了吗?我正在使用Visual Studio 2011测试版。

3 个答案:

答案 0 :(得分:2)

这不符合您的想法:

ifstream file("C:\Users\Chinmay\Documents\Array.txt");

使用正斜杠(即使在Windows上)并立即检查文件是否成功:

std::ifstream ifs("C:/Users/Chinmay/Documents/Array.txt");
if (!ifs) 
{
    // Failed to open file. Handle this here.
}

答案 1 :(得分:0)

我没有看到第二个版本有什么不妥。

但是,在第一个版本中,您正在调用file.getline(str,7);,其中该行有时包含7位数字。这将读取,直到命中分隔符(默认'\n'),或者直到读取了6个字符为止,在这种情况下failbit已设置。

因为您只是在eof循环中测试while,所以它不会退出。

如果您在getline调用中将7更改为8,并在上面的行中将char数组声明更改为,则应该可以正常工作。

所有这一切,@ Niklas B建议使用int tmp; file >> tmp;并存储在vector中可能是最简单的解决方案。

答案 2 :(得分:-1)

这是一个很好的代码 http://www.java2s.com/Code/Cpp/File/readingatextfile.htm
如果这适用于您的文件,则只需添加作业

即可

nArray [i ++] = atoi(line);在cout之后。


如果它仍然有效..然后注释掉cout ..可能会留在那里注释掉,因为它可能会向你的老师展示你的过程。有些教授只想看看成品,这取决于你