Чтение чисел из файла * .txt в C ++ с использованием fstream - PullRequest
1 голос
/ 27 марта 2012

У меня есть * .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 выходит за один проход. и массив пуст. Я посмотрел в Интернете и попробовал другие вещи, такие как код, приведенный здесь на

учебник по коду

#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 ]

2 голосов
/ 27 марта 2012

Это не то, что вы думаете:

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.
}
0 голосов
/ 27 марта 2012

Я не вижу ничего плохого во второй версии.

Однако в первой версии вы звоните file.getline(str,7);, где в строке иногда содержится 7-значный номер. Это читает, пока не будет достигнут разделитель (по умолчанию '\n'), или пока не будут прочитаны 6 символов, в этом случае устанавливается failbit.

Поскольку вы проверяете только eof в цикле while, он не завершается.

Если вы измените 7 на 8 в вызове getline и объявлении массива char в строке выше, это должно сработать.

С учетом всего сказанного, предложение @Niklas B об использовании int tmp; file >> tmp; и сохранении в vector, вероятно, было бы самым простым решением.

0 голосов
/ 27 марта 2012

Это хороший кусок кода http://www.java2s.com/Code/Cpp/File/readingatextfile.htm
Если это работает с вашим файлом, просто добавьте свое назначение

nArray [i ++] = atoi (строка); после схватки.


Если это все еще работает ..., тогда закомментируйте cout. Возможно, было бы хорошо оставить это там закомментированным, поскольку это может показать вашему учителю ваш процесс. Некоторые профессионалы просто хотят увидеть готовый продукт, так что решать вам

...