我正在尝试将一些数据输出到.csv文件,然后将其输出到文件中,但它没有将数据分成不同的列,并且似乎输出数据不正确。
ofstream Morison_File ("linear_wave_loading.csv"); //Opening file to print info to
Morison_File << "Time Force(N/m)" << endl; //Headings for file
for (t = 0; t <= 20; t++) {
u = sin(omega * t);
du = cos(omega * t);
F = (0.5 * rho * C_d * D * u * fabs(u)) + rho * Area * C_m * du;
cout << "t = " << t << "\t\tF = " << F << endl;
Morison_File << t; //Printing to file
Morison_File << F;
}
Morison_File.close();
时间和力(N / m)分别在A列和B列中,但t和F值都在打印第一行。
将它们分别打印到A列和F列到B列的语法是什么?
答案 0 :(得分:62)
CSV文件没有什么特别之处。您只需按照basic rules即可使用文本编辑器创建它们。 RFC 4180 (tools.ietf.org/html/rfc4180)接受的分隔符是逗号&#39;,&#39;不是分号&#39 ;;&#39;。像MS Excel这样的程序希望逗号作为分隔符。
有些程序将逗号视为小数,将分号视为分隔符,但这些程序在技术上不属于&#34;接受&#34; CSV格式文件的标准。
因此,在创建CSV时,您需要创建文件流并添加以下行:
#include <iostream>
#include <fstream>
int main( int argc, char* argv[] )
{
std::ofstream myfile;
myfile.open ("example.csv");
myfile << "This is the first cell in the first column.\n";
myfile << "a,b,c,\n";
myfile << "c,s,v,\n";
myfile << "1,2,3.456\n";
myfile << "semi;colon";
myfile.close();
return 0;
}
这将导致在MS Excel中打开时看起来像这样的CSV文件:
答案 1 :(得分:8)
更改
Morison_File << t; //Printing to file
Morison_File << F;
到
Morison_File << t << ";" << F << endl; //Printing to file
a,也可以代替;
答案 2 :(得分:6)
这是类似STL的类
文件&#34; csvfile.h&#34;
#pragma once
#include <iostream>
#include <fstream>
class csvfile;
inline static csvfile& endrow(csvfile& file);
inline static csvfile& flush(csvfile& file);
class csvfile
{
std::ofstream fs_;
const std::string separator_;
public:
csvfile(const std::string filename, const std::string separator = ";")
: fs_()
, separator_(separator)
{
fs_.exceptions(std::ios::failbit | std::ios::badbit);
fs_.open(filename);
}
~csvfile()
{
flush();
fs_.close();
}
void flush()
{
fs_.flush();
}
void endrow()
{
fs_ << std::endl;
}
csvfile& operator << ( csvfile& (* val)(csvfile&))
{
return val(*this);
}
csvfile& operator << (const char * val)
{
fs_ << '"' << val << '"' << separator_;
return *this;
}
csvfile& operator << (const std::string & val)
{
fs_ << '"' << val << '"' << separator_;
return *this;
}
template<typename T>
csvfile& operator << (const T& val)
{
fs_ << val << separator_;
return *this;
}
};
inline static csvfile& endrow(csvfile& file)
{
file.endrow();
return file;
}
inline static csvfile& flush(csvfile& file)
{
file.flush();
return file;
}
文件&#34; main.cpp&#34;
#include "csvfile.h"
int main()
{
try
{
csvfile csv("MyTable.csv"); // throws exceptions!
// Hearer
csv << "X" << "VALUE" << endrow;
// Data
csv << 1 << "String value" << endrow;
csv << 2 << 123 << endrow;
csv << 3 << 1.f << endrow;
csv << 4 << 1.2 << endrow;
}
catch (const std::exception& ex)
{
std::cout << "Exception was thrown: " << e.what() << std::endl;
}
return 0;
}
最新版本here
答案 3 :(得分:2)
你必须“;” separator,CSV =&gt;逗号分隔符值
ofstream Morison_File ("linear_wave_loading.csv"); //Opening file to print info to
Morison_File << "'Time'; 'Force(N/m)' " << endl; //Headings for file
for (t = 0; t <= 20; t++) {
u = sin(omega * t);
du = cos(omega * t);
F = (0.5 * rho * C_d * D * u * fabs(u)) + rho * Area * C_m * du;
cout << "t = " << t << "\t\tF = " << F << endl;
Morison_File << t << ";" << F;
}
Morison_File.close();
答案 4 :(得分:1)
如果要使用C ++创建.csv文件,则应使用以下语法:
myfile <<" %s; %s; %d", string1, string2, double1 <<endl;
这会将三个变量(字符串1&2和double1)写入单独的列,并在其下面留空行。在excel中;表示新行,因此,如果您只想换一个新行,您还可以编写一个简单的“;”在将新数据写入文件之前。如果您不想在下面有一个空行-您应该删除endl并使用:
myfile.open("result.csv", std::ios::out | std::ios::app);
打开.csv文件时的语法(例如result.csv)。这样,下次您将某些内容写入到result.csv文件中时-它会将其写入到最后一个文件的正下方的新行中-因此,您可以轻松地管理for循环。
答案 5 :(得分:0)
如上面@kris所述,根据MS Excel的区域配置,它不会将逗号解释为分隔符。就我而言,我不得不将其更改为分号