C++;:可能的Xcode(Mac)问题。Can';t使用getline()从外部文件读入数字 我是Mac Xcode(3.2.2)用户,使用GCC 4.2编译器,对C++相当缺乏,对编译器完全无知。
我需要从外部文件中读取数字,并将它们存储在整数向量中。我使用streams和getline()编写代码。我可以编译代码,它运行时没有错误,但没有输出。不过,它适用于朋友(非Mac和非GCC4.2编译器)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
我做了一些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