|
The problem then is with Excel, either its settings or the version
you're using.
I tested the file produced by your code on Office Excel 2007.
The file opens fine and puts the A in one cell (column A) and the B
in another cell (column B), but only after answering the prompts to
tell excel what the delimiter is.
Then I added the code to write a newline and tested it again. Excel
opened it and placed the items in separate cells on the same row with no
prompting.
I'm not sure how you expect to fix it by writing the file differently, unless
there's some proprietary Excel CSV format.
(Note that a valid newline (either a CR or CR/LF pair) is generally required at the
end of rows in a generic CSV file)
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
|
Hi,
comma's within double quotes are NOT delimiters as far as CSV goes.
My guess is you have (way) too many double quotes in your output, get rid of all of them, except the ones that are meant to be there and prevent a cell to be split in halfs (in case a cell is meant to contain a comma).
If you have trouble doing this, show us your code and a sample of the output it generates.
Luc Pattyn [Forum Guidelines] [My Articles]
- before you ask a question here, search CodeProject, then Google
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get
- use the code block button (PRE tags) to preserve formatting when showing multi-line code snippets
|
|
|
|
|
I was trying to answer your latest message, but it has disappeared somehow. It started like
this:
Hi Luc,
That is the problem!! The output generated by my code contains unwanted double quotes (although they are visible only when you rename the file as .txt)! Instead I'd like the output to appear as
1,2
rather than
"1,2"
.
[confused]
My code, as it appears at the beginning of the thread, is:
String^ fName1 = "My File.csv";
StreamWriter^ outStream = File::CreateText(fName1);
outStream->Write("A");
outStream->Write(",");
outStream->Write("B");
outStream->NewLine;
outStream->Close();
Here is my reply anyway:
Hi,
J_E_D_I wrote: they are visible only when you rename the file as .txt
does not make sense to me. The content of the file is independent of the file name.
J_E_D_I wrote: outStream->NewLine;
does not make sense at all, the NewLine property gets or sets something, so it is part of an expression, not a statement by itself. That line does not achieve anything, as you have been told before.
Here is a little experiment that works fine, it is C# code, I had a C# project open:
StreamWriter wr=File.CreateText(@"F:\out.txt");
wr.Write("A");
wr.Write(",");
wr.WriteLine("B");
wr.Write("A");
wr.Write(",");
wr.WriteLine("B");
wr.Close();
and it generates
A,B
A,B
without any double quotes.
Are you sober?
Luc Pattyn [Forum Guidelines] [My Articles]
- before you ask a question here, search CodeProject, then Google
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get
- use the code block button (PRE tags) to preserve formatting when showing multi-line code snippets
|
|
|
|
|
Sorry Luc,
I realized I had written lots of cr*p and I tried to delete my post but unfortunately you replied before I managed to do so!
I solved the mystery however. As Mark correctly pointed out I was using the wrong syntax to add a new line without realizing it.
I was using
outStream->NewLine;
Whereas I should have used
outStream->Write(outStream->NewLine);
The "new line" instruction was ignored and I ended up with two items in the same cell using Excel.
Thanks to you all guys, problem solved!
|
|
|
|
|
Hey Luc, I pressed on "Vote to remove this message" as I thought it could be confusing for other readers and it said your message was reported for abuse! Sorry, that was not my intention!! Mmmmm, better if I take a LOOOOOONG vacation from the forum...
|
|
|
|
|
[ONSLOW VOICE]O great. There goes the neighbourhood.[/ONSLOW VOICE]
Luc Pattyn [Forum Guidelines] [My Articles]
- before you ask a question here, search CodeProject, then Google
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get
- use the code block button (PRE tags) to preserve formatting when showing multi-line code snippets
|
|
|
|
|
Slightly out of topic,
C++/CLI supports stack semantics. Your code can be rewritten like
String^ fName1 = "My File.csv";
StreamWriter outStream(fName1);
outStream.Write("A");
outStream.Write(",");
outStream.Write("B");
outStream.NewLine; This will dispose the StreamWriter when the scope ends.
|
|
|
|
|
Thanks Navaneeth,
However there is an error in the new line command.
outStream.NewLine;
outStream.Write(outStream.NewLine);
Cheers.
|
|
|
|
|
Hi J_E_D_I,
put
sep=<separator symbol="">
in the very first line, then it works even with a double click.
Works well except with CRLF
regards
CBM 6502
|
|
|
|
|
Hi J_E_D_I,
put
sep=<separator symbol>
in the very first line, then it works even with a double click.
Works well except with CRLF
regards
CBM 6502
|
|
|
|
|
Hi - I've saved a System.Drawing.Image to a file stream from C# and now I'm trying to load it in Managed C++...
I have some other data that is included inbetween the bitmap data in the filestream and when I blt the surface to the backbuffer, the surface thats supposed to hold the bitmap data is entirely black. :-/
Tiles[i].Init(lpDD7);
bool Walkable = br->ReadBoolean();
MemoryStream^ ms = gcnew MemoryStream(br->ReadBytes(TILE_BITMAPSIZE));
Image^ bm = Image::FromStream(ms, true, true);
Graphics^ g = Graphics::FromImage(bm);
IntPtr^ hDC = g->GetHdc();
HDC src = static_cast<HDC>(hDC->ToPointer());
HDC dst;
Tiles[i].Walkable = Walkable;
Tiles[i].Surface->GetDC(&dst);
BitBlt(dst, 0, 0, 32, 32, src, 0, 0, SRCCOPY);
Tiles[i].Surface->ReleaseDC(dst);
Heres the INIT function
void Init(LPDIRECTDRAW7 lpDD7)
{
DDSURFACEDESC2 ddsd;
INIT_DXSTRUCT(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth = 32;
ddsd.dwHeight = 32;
HRESULT hr = lpDD7->CreateSurface(&ddsd, &Surface, NULL);
}
Thanks.
|
|
|
|
|
Solved the problem...
the Bitmap class can be cast into an HBITMAP & then selected as an HDC to be copied into the surface.
Heres the fixed code:
MemoryStream^ ms = gcnew MemoryStream(br->ReadBytes(TILE_BITMAPSIZE));
Bitmap^ bm = gcnew Bitmap(Image::FromStream(ms, true, true));
HBITMAP hbm = (HBITMAP)bm->GetHbitmap().ToPointer();
HDC src = CreateCompatibleDC(NULL);
SelectObject(src, hbm);
HDC dst;
BitBlt(dst, 0, 0, Width, Height, src, 0, 0, SRCCOPY);
|
|
|
|
|
i have got application settings stored in the registry, i want to read the registry only once and store the settings in an array of struct globally and use them through out the application.i tried it but C++/CLI doesnt allow it,how do i do it, can someone tell me an alternate way.
Naveen
|
|
|
|
|
What do you mean C++/CLI doesn't allow it?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
i mean managed code doesn't allow to declare array of structs as global.
if possible can u please guide me
thank you
Naveen
|
|
|
|
|
Read about Singleton pattern.
|
|
|
|
|
i tried to read the documents ,but i couldn't understand. Below is the code i tried to use but it doesn't work. can u please help me do it
public ref struct HostSetting
{
static String ^HName;
static String ^HAddr;
static Collections::ArrayList ^cardType = gcnew System::Collections::ArrayList();
static String ^HCommtype;
static String ^HMsgType;
static String ^HPriority;
static String ^oldHostName;
};
array <hostsetting^>^ hostList = gcnew array<hostsetting^>(5);
Naveen
|
|
|
|
|
Ok. Here is a sample of singleton.
ref class MySettings
{
public:
static property MySettings^ Instance
{
MySettings^ get()
{
if(!instance)
LoadSetting();
return instance;
}
}
private:
static void LoadSetting()
{
instance = gcnew MySettings();
}
static MySettings^ instance;
}; You can use it like
MySettings^ currentSettings = MySettings::Instance; Here we have persisted the value in a static field and this value will be available until your application domain unloads.
If your application is multi-threaded, you need more precautions when using singleton.
|
|
|
|
|
thanks a lot.
but how can i have an array of class and how to access a particular array element and where shall i declare all my structure elements.i am new to c++/cli i am not able to understand the code u have written, i had posted the code, can u please explain it in that terms.
Sorry for the trouble.
Naveen
|
|
|
|
|
naveen_bij wrote: but how can i have an array of class and how to access a particular array element
Assume you have a class named Foo. Array of Foo can be created like
array<Foo^>^ fooArray = gcnew array<Foo^> {gcnew Foo(),gcnew Foo()}; You can use indexer to access the elements. Like
Foo^ first = fooArray[0]; naveen_bij wrote: i am new to c++/cli i am not able to understand the code u have written, i had posted the code, can u please explain it in that terms.
Code which I have posted is trivial. You can easily understand it and merge it with your own code. Just add your properties to it and write code in LoadSetting method.
|
|
|
|
|
is the below code correct and when ever i load the parameters from registry, i load the whole array of class.
public ref class HostSettings
{
public:
static String ^HName;
static String ^HAddr;
static Collections::ArrayList ^cardType = gcnew System::Collections::ArrayList();
static String ^HCommtype;
static String ^HMsgType;
static String ^HPriority;
static String ^oldHostName;
static property HostSettings^ Instance
{
HostSettings^ get()
{
if(!instance)
LoadSetting();
return instance;
}
}
private:
static void LoadSetting()
{
instance = gcnew HostSettings();
}
static HostSettings^ instance;
};
array<HostSettings^>^ HostList = gcnew array<HostSettings^> (5);
i want the whole array to be available till the application unloads
this is the error i am getting when i do a global class array declaration
'HostList' : global or static variable may not have managed type 'cli::array<type> ^'<br />
1> with<br />
1> [<br />
1> Type=HostSettings ^<br />
1> ]<br />
1> may not declare a global or static variable, or a member of a native type that refers to objects in the gc heap</type>
Naveen
|
|
|
|
|
I have converted my VC++ project to Common Language Runtime Support (/clr).
After this i find debugging(F5) calculation is too slow.
But in release mode there is no such problem.
Any solution for this problem?
|
|
|
|
|
KASR1 wrote: Any solution for this problem?
Don't run in the debugger?
Just don't do any serious performance profiling when running in the debugger
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hi,
some simple manual code optimization may (or may not) solve such problems. Here is a typical example (using C# syntax):
Bitmap bm=new Bitmap(otherBitmap);
for (int x=0; x< bm.Width; x++) {
for (int y=0; y< bm.Height; y++) {
}
}
in debug mode bm.Height will be evaluated for each and every pixel, possibly costing more CPU cycles than the actual pixel operation. Replace the above by:
Bitmap bm=new Bitmap(otherBitmap);
int height=bm.Height;
for (int x=0; x< bm.Width; x++) {
for (int y=0; y< height; y++) {
}
}
and it will run much faster in debug.
Luc Pattyn [Forum Guidelines] [My Articles]
- before you ask a question here, search CodeProject, then Google
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get
- use the code block button (PRE tags) to preserve formatting when showing multi-line code snippets
|
|
|
|