C ++: возможная проблема Xcode (Mac).Не могу прочитать числа из внешнего файла с помощью getline () - PullRequest
1 голос
/ 14 февраля 2011

Я пользователь Mac Xcode (3.2.2), работаю с компилятором GCC 4.2, довольно неопытен в C ++ и совершенно не осведомлен о компиляторах.

Мне нужно читать цифры из внешнего файла ихранить их в векторе целыхЯ написал код с использованием потоков и getline ().Я могу скомпилировать код, и он работает без ошибок, но нет вывода.Это работает для друга (не Mac и не GCC 4.2 компилятор), хотя.

Я немного погуглил и нашел несколько сообщений о возможной проблеме компилятора (gcc, Apple) в Xcode 3.2.1, которая может иметь отношение кк моей проблеме (эта, например: C ++ с использованием getline () печатает: освобождаемый указатель не был выделен в XCode. Однако у меня есть Xcode 3.2.2. Я попробовал предложенные исправления (связанные с добавлением _GLIBCXX_FULLY_DYNAMIC_STRING в (1)окно настроек цели или (2) как макросы препроцессора перед включением), но моя проблема все еще не решена.

Так что я не знаю, в чем моя проблема на данный момент - является ли это тот же компиляторпроблема, которая была у людей в Xcode 3.2.1, но в 3.2.2 требуется другое исправление, или если в моем коде есть какая-то другая проблема.

Было бы замечательно, если бы кто-то мог дать какой-то совет.Это слишком просто. Если есть другой способ импортировать числа из внешнего файла, я хотел бы знать об этом. Кроме того, кто-нибудь знает, будет ли какая-либо причина, по которой яВозможно ли импортировать данные из файла .dat, но не из файла .txt на Mac?

Спасибо.

С момента первой публикации я включил правки Вильгельмтелла.

Цель: чтение чисел из текстового файла в вектор целых чисел, называемый «результаты».

1) Данные в файле данных test.dat изначально выглядели как

// Test

test

'1' '2' '3'

// В текстовом файле также есть ярлыки и комментарии, которые я не хочу читатьв, но не может удалить из файла.

#include <algorithm>
#include <cctype>
#include <iterator>
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <sstream>

using namespace std;

// Edited: added struct (wilhelmtell's advice)
struct not_digit_and_not_whitespace {
    bool operator()(char c) const {
        return ! std::isdigit(c) && ! std::isspace(c);
    }
};

int main()
{
    system("pwd");

    std::string line;
    const std::string fileName = "/Users/me/test.dat";  

    ifstream theStream( fileName.c_str() ); 

    if( ! theStream )
          std::cerr << "Error opening file test.dat\n";

    std::getline( theStream, line );
    // line.erase(remove( line.begin(), line.end(), '\'' ), line.end() ); // Edited (wilhelmtell's advice)
    line.erase(remove_if( line.begin(), line.end(),not_digit_and_not_whitespace()), line.end() );  // Edited: added (wilhelmtell's advice)

    std::istringstream myStream( line );
    std::vector<int> numbers((std::istream_iterator<int>(myStream)), std::istream_iterator<int>());

    std::copy(numbers.begin(), numbers.end(),
              std::ostream_iterator<int>(std::cout, "\n"));

    /* int temp;  // Edited: wilhemtell suggested using iterators instead.
    while ( myStream >> temp ){
        numbers.push_back( temp );
     std::cout << temp << std::endl;
    }*/
    return 0;
}

Ответы [ 2 ]

1 голос
/ 15 февраля 2011

Это может сработать для вас.Он использует getline, как вы пытались, но использует символ '\' 'в качестве разделителя строк.Игнорировать все до первого ».Предположим, что все до следующего 'является частью числа.Продолжайте до тех пор, пока не выйдет из строя логика (предположительно из-за конца файла).

#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <iterator>

int main()
{
    system("pwd");

    std::string line;
    const std::string fileName = "test.dat";  

    std::ifstream theStream( fileName.c_str() ); 

    if( ! theStream )
          std::cerr << "Error opening file test.dat\n";

    std::vector<int> numbers;

    while (true)
    {
        // get first '
        std::getline(theStream, line, '\'');
        // read until second '
        std::getline(theStream, line, '\'');
        std::istringstream myStream( line );
        int i;
        myStream >> i;
        if (myStream.fail())
            break;
        numbers.push_back(i);
    }
    std::copy(numbers.begin(), numbers.end(),
              std::ostream_iterator<int>(std::cout, "\n"));
}
0 голосов
/ 15 февраля 2011

Я предполагаю, что ваш файл test.dat не находится в рабочем каталоге.Чтобы убедиться, что вы можете протестировать поток:

if( ! theStream )
    std::cerr << "Error opening file test.dat\n";

Проверьте свойства вашего проекта в XCode, чтобы увидеть, каков рабочий каталог, и поместите туда файл.

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

#include <cctype>  // algorithm iterator ...

struct not_digit_and_not_whitespace {
    bool operator()(char c) const {
        return ! std::isdigit(c) && ! std::isspace(c);
    }
};

// ...
line.erase(remove_if( line.begin(), line.end(),
                     not_digit_and_not_whitespace()),
           line.end() );

Кроме того, вы можете упростить свой код.Во-первых, если вы включите <iostream>, тогда вам не нужно <istream>.Во-вторых, вы можете использовать конструктор диапазона std::vector, чтобы получить целые числа.

#include <algorithm>  // iterator fstream iostream vector string sstream

int main()
{
    std::string line;
    std::ifstream theStream("test.dat");
    std::getline(theStream, line);
    line.erase(std::remove(line.begin(), line.end(), '\'' ),
               line.end());
    std::istringstream myStream(line);
    std::vector<int> numbers((std::istream_iterator<int>(myStream)),
                             std::istream_iterator<int>());
    std::copy(numbers.begin(), numbers.end(),
              std::ostream_iterator<int>(std::cout, "\n"));
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...