954,480 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

fgets/puts creates weird output

Dear all,

I have a weird problem reading a file using fgets. The code below should read the first line of the file "F:\\filename.csv". It works for all sorts of files that I create myself, but it does NOT work for certain files that I download from the internet.

More precisely, I download a csv file from Google Insight (see http://www.google.com/insights/search/#q=London&cmpt=q) , and when I try the code on the downloaded file, I don't get the first line but the string has the following value: "ÿþW", which displays as a little square, followed by a capital "W".

Any ideas what's going wrong?
This is the code that I'm using:

#include <stdio.h>
#include <string.h>

int main ()
{
   FILE *in=fopen("F:\\filename.csv","r"); 
   char mystring [100];
   fgets (mystring , 100 , in); 
   puts (mystring);
   fclose (in);
   return 0;
}


I appreciate any help!
Thanks a lot,
Anne

anne_1000
Newbie Poster
4 posts since Jul 2009
Reputation Points: 26
Solved Threads: 0
 

Welcome anne_1000,
Google csv is unicode text file.

__avd
Posting Genius (adatapost)
Moderator
8,648 posts since Oct 2008
Reputation Points: 2,136
Solved Threads: 1,241
 

Hi adatapost!
Thanks a lot for the useful hint. Do you know of any straightforward way of either converting theGoogle csv file to ASCII, or reading a Unicode file in C/C++? I tried googleing how to do that, but the answers seem to be extremely complicated...

Thnx,
Anne

anne_1000
Newbie Poster
4 posts since Jul 2009
Reputation Points: 26
Solved Threads: 0
 
__avd
Posting Genius (adatapost)
Moderator
8,648 posts since Oct 2008
Reputation Points: 2,136
Solved Threads: 1,241
 

Hi adatapost,
thanks again. I tried using wstring, but the following code does not even compile, and I can't quite figure out why.

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
	
	ifstream myfile("F:\\filename.txt");
	wstring line;

	if (myfile.is_open())
	{
		while (! myfile.eof() )
		{
     			getline(myfile,line);
				wcout << line << endl;
 		}

    		myfile.close();
 	 }

	return 0;
}


Any ideas what's going wrong?
The first error message referes to line 16; it sayserror C2784: 'std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &)' : could not deduce template argument for 'std::basic_istream<_Elem,_Traits> &' from 'std::ifstream'
1> c:\program files\microsoft visual studio 8\vc\include\string(528) : see declaration of 'std::getline'
But this doesn't help me in any ways..
Sorry I might be being stupid but I have just started using C/C++.

Thanks,
Anne

anne_1000
Newbie Poster
4 posts since Jul 2009
Reputation Points: 26
Solved Threads: 0
 

You might want to read this thread -- lots of good info about unicode files and how to read them.

Ancient Dragon
Retired & Loving It
Team Colleague
30,049 posts since Aug 2005
Reputation Points: 5,662
Solved Threads: 2,343
 

Thanks a lot. I have been trying all sorts of code from the internet to convert unicode strings to ascii strings, but so far nothing works. Most of the stuff that I find online is pretty long, and impossible to understand for me as a beginner.

The following code should do it, but I get an error when compiling.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;

int main()
{
	wchar_t WideStr[] = L"Unicode!";
	char x[] = "longlongstring";
	wcstombs(&x, WideStr, 1024);
	return 0;
}


The error iserror C2664: 'wcstombs' : cannot convert parameter 1 from 'char (*__w64 )[15]' to 'char *'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>myCOnverter.cpp

Could someone tell me what that means, or how I can find out myself what the error is?
Thanks,
Anne

anne_1000
Newbie Poster
4 posts since Jul 2009
Reputation Points: 26
Solved Threads: 0
 

wcstombs - convert unicode to multibytes.

wcstombs(x, WideStr, 1024);
__avd
Posting Genius (adatapost)
Moderator
8,648 posts since Oct 2008
Reputation Points: 2,136
Solved Threads: 1,241
 

where did the "C++" forum go?

jephthah
Posting Maven
2,587 posts since Feb 2008
Reputation Points: 2,143
Solved Threads: 179
 

if u can do some manual work then
1)Open your Unicode file with notepad and save as ANSI.
Then read that file it using C
or else
in DOS use
command:type filename > filename1
Then read the filename1 using C

-----------

If your want to develop a Unicode reading tool using C then
You can go by Ancient Dragon or adatapost.

Thanks,
DP

Dream2code
Junior Poster
144 posts since Jun 2009
Reputation Points: 22
Solved Threads: 12
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You