C++;:可能的Xcode(Mac)问题。Can';t使用getline()从外部文件读入数字 我是Mac Xcode(3.2.2)用户,使用GCC 4.2编译器,对C++相当缺乏,对编译器完全无知。

C++;:可能的Xcode(Mac)问题。Can';t使用getline()从外部文件读入数字 我是Mac Xcode(3.2.2)用户,使用GCC 4.2编译器,对C++相当缺乏,对编译器完全无知。,c++,stream,streaming,getline,C++,Stream,Streaming,Getline,我需要从外部文件中读取数字,并将它们存储在整数向量中。我使用streams和getline()编写代码。我可以编译代码,它运行时没有错误,但没有输出。不过,它适用于朋友(非Mac和非GCC4.2编译器) 我做了一些Google搜索,发现了一些关于XCudi3.3.1可能编译器(GCC,Apple)问题的文章,这可能与我的问题有关(例如,C++使用GETLILE()):在XCART中没有分配指针,但我有XCOD3.3.2。我尝试了建议的修复(与添加GyLobCxxxx FulyLyDigixSyp

我需要从外部文件中读取数字,并将它们存储在整数向量中。我使用streams和getline()编写代码。我可以编译代码,它运行时没有错误,但没有输出。不过,它适用于朋友(非Mac和非GCC4.2编译器)

我做了一些Google搜索,发现了一些关于XCudi3.3.1可能编译器(GCC,Apple)问题的文章,这可能与我的问题有关(例如,C++使用GETLILE()):在XCART中没有分配指针,但我有XCOD3.3.2。我尝试了建议的修复(与添加GyLobCxxxx FulyLyDigixSype字符串有关)(1) 目标设置窗口或(2)作为预处理器宏,但我的问题仍然没有解决

因此,我不知道我现在的问题是什么——是否与人们在Xcode 3.2.1中遇到的编译器问题相同,但在3.2.2中需要不同的修复,或者我的代码中是否存在其他问题

如果有人能提供一些建议,那就太好了。没有什么建议太简单了。如果有其他方法从外部文件导入数字,我很想知道。还有,有人知道是否有任何理由可以从.dat文件导入数据,但不能从Mac上的.txt文件导入数据

多谢各位

自从第一次发帖以来,我已经收录了威廉·泰尔的编辑

目标:将数字从文本文件读入名为“结果”的整数向量

1) 数据文件test.dat中的数据最初看起来像

//试验

试验

“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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
//编辑:添加结构(wilhelmtell的建议)
结构非数字和非空白{
布尔运算符()(字符c)常量{
return!std::isdigit(c)和&!std::isspace(c);
}
};
int main()
{
系统(“pwd”);
std::字符串行;
const std::string fileName=“/Users/me/test.dat”;
ifstream流(fileName.c_str());
如果(!流)

std::cerr我猜您的test.dat文件不在工作目录中。要验证您是否可以测试流,请执行以下操作:

if( ! theStream )
    std::cerr << "Error opening file test.dat\n";
此外,还可以简化代码。首先,如果包含
,则不需要
。其次,可以使用
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;
}
#包含//迭代器fstream iostream向量字符串sstream
int main()
{
std::字符串行;
std::如果流(“test.dat”);
std::getline(流,行);
line.erase(std::remove(line.begin(),line.end(),'\''),
line.end());
std::istringstream myStream(行);
std::矢量数((std::istream_迭代器(myStream)),
std::istreamu迭代器();
std::copy(numbers.begin(),numbers.end(),
std::ostream_迭代器(std::cout,“\n”);
返回0;
}

我猜您的test.dat文件不在工作目录中。要验证您是否可以测试流,请执行以下操作:

if( ! theStream )
    std::cerr << "Error opening file test.dat\n";
此外,还可以简化代码。首先,如果包含
,则不需要
。其次,可以使用
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;
}
#包含//迭代器fstream iostream向量字符串sstream
int main()
{
std::字符串行;
std::如果流(“test.dat”);
std::getline(流,行);
line.erase(std::remove(line.begin(),line.end(),'\''),
line.end());
std::istringstream myStream(行);
std::矢量数((std::istream_迭代器(myStream)),
std::istreamu迭代器();
std::copy(numbers.begin(),numbers.end(),
std::ostream_迭代器(std::cout,“\n”);
返回0;
}

这可能适用于您。它在您尝试时使用getline,但使用“\”字符作为行分隔符。忽略第一个字符之前的所有内容。假设下一个字符之前的所有内容都是数字的一部分。继续,直到逻辑失败(可能是由于文件结束)

#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
系统(“pwd”);
std::字符串行;
const std::string fileName=“test.dat”;
std::ifstream theStream(fileName.c_str());
如果(!流)
标准:cerr>i;
if(myStream.fail())
打破
数字。推回(i);
}
std::copy(numbers.begin(),numbers.end(),
std::ostream_迭代器(std::cout,“\n”);
}

这可能适用于您。它在您尝试时使用getline,但使用“\”字符作为行分隔符。忽略第一个字符之前的所有内容。假设下一个字符之前的所有内容都是数字的一部分。继续,直到逻辑失败(可能是由于文件结束)

#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
系统(“pwd”);
std::字符串行;
const std::string fileName=“test.dat”;
std::ifstream theStream(fileName.c_str());
如果(!流)
标准:cerr>i;
if(myStream.fail())
打破
数字。推回(i);
}
std::copy(numbers.begin(),numbers.end(),
std::ostream_迭代器(std::cout,“\n”);
}

除非您发布源代码,至少在崩溃发生的区域,否则我怀疑是否有人能帮助您。我怀疑它正在输出一些东西,但不是以您期望的方式输出。如果您编译一个“Hello World”程序,你能看到它的输出吗?我制作了一个Hello World,它工作了,所以我试着用我的原始版本中的字符串替换int