所以我写了上面的代码,我在下面有这个错误。我从这里看到getline只适用于char,我试图用其他方式编写它,使用cin .. 但它不起作用,任何sugestions?
我真的需要帮助...
#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
#include <sstream>
using namespace std;
int main()
{
int n;
double sum[100];
double source[100];
int broj;
ifstream ulaz("dat.txt", ios::in);
if(ulaz.is_open())
{
while(!ulaz.eof())
{
cin.sync();
cin.clear();
ulaz.getline(source,sizeof(source));
broj++;
}
}
ulaz.close();
cout<<"Insert number of days:"<<endl;
cin>>n;
for(int i=0; i<broj; i++)
{
sum[i]=1000*source[i];
sum[i]=sum[i]/source[i+1];
}
cout<<"Result: "<<sum<<endl;
system("pause");
return 0;
}
1>------ Build started: Project: Zadaci_za_1l, Configuration: Debug Win32 ------
1> zadatak2.cpp
1>c:\users\****.cpp(23): error C2664: 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::getline(_Elem *,std::streamsize)' : cannot convert parameter 1 from 'double [100]' to 'char *'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
答案 0 :(得分:1)
其他人指出:getline
不适合double
。
如果您的文件包含多个由空格或换行符分隔的双精度数,则可以使用std::istream::operator>>(double&)
隐式使用std::istream_iterator<double>
。
此外,如果要处理灵活数量的值,请不要使用C样式数组,而是使用向量。
代码读取从文件data.txt
(仅包含双打)加倍到向量中,然后将它们相加可能看起来像
#include <fstream>
#include <vector>
#include <string>
#include <iostream>
#include <iterator>
std::vector<double> dv_from_file(std::string const & filename)
{
std::ifstream input(filename.c_str(), std::ios_base::in);
std::vector<double> data;
if (input.good())
{
std::copy(std::istream_iterator<double>(input),
std::istream_iterator<double>(),
std::back_inserter(data));
}
return data;
}
int main(void)
{
std::vector<double> source(r_dv_from_file("data.txt"));
std::vector<double>::size_type const N(source.size());
double sum(0.0);
for (auto value : source) sum += value;
std::cout << "File contains " << N << " elements." << std::endl;
std::cout << "Sum of all elements is: " << sum << std::endl;
}
答案 1 :(得分:0)
在这里查看fstream getline参考:std::istream::getline。正如其他人已经评论过的那样,getline方法期望指向一个字符的指针,以及读入该内存的字符数。在获得该行之后,有必要将字符数据转换为double并适当地存储。
或者,根据输入文件内容的构造方式,您可以使用输入流操作符自动将输入行转换为给定的double数组元素。更多详情请点击此处:std::istream::operator>>。如果输入文件行数量恒定或小于分配的数组大小,这对于编译时大小的数组可以很好地工作。如果没有,那么就必须使用像矢量更好的东西。首先将单行读入本地双变量,然后在向量上调用push_back以存储该值以供以后使用。然后从输入文件继续下一行。
为了帮助减少混淆,建议不要将C库字符串处理与C ++流混合使用。尝试在同一设计中使用两个库时,还有更多要跟踪并且不会引入缓冲区溢出。换句话说,通过专注于单个库来发挥其安全性。如果C ++是目标,那么iostream,sstrstream,ifstream,ostream等就是你想要的。