Avatar billede neocron Nybegynder
09. april 2007 - 02:04 Der er 20 kommentarer og
1 løsning

I/O med C++.Net

Heysa,

Jeg har skiftet fra en ussel og elendig compiler (som skulle være C++ men kun understøttede C... (?!)) og nu bruger jeg Visual Studio 2005, og dermed .NET.

Jeg har nogle problemer med at finde ud af hvordan man åbner filer og læser/skriver fra/til dem. Jeg har rodet med den go'e gamle måde med of- og ifstream, men det virker ikke. Er der nogen der ved hvor meget den har ændret sig? Jeg har kigget på MSDN, men den har ikke meget at byde på her, desværre.

Hvis der eventuelt kunne gives et eksempel ville jeg være glad.. kunne de ikke bare lade være med at ændre på alt muligt når de endelig smed det med i .NET? :(
Avatar billede neocron Nybegynder
09. april 2007 - 02:07 #1
Det skal bemærkes at jeg ikke rigtig kan få det til at spille, både i console applications og med forms.
Avatar billede arne_v Ekspert
09. april 2007 - 02:20 #2
ifstream og ofstream bør også virke med C++.NET
Avatar billede arne_v Ekspert
09. april 2007 - 02:21 #3
hvis du vil bruge .NET klasserne så er det StreamReader og StreamWriter du skal kigge på
Avatar billede arne_v Ekspert
09. april 2007 - 02:44 #4
følgende koder virker
Avatar billede arne_v Ekspert
09. april 2007 - 02:44 #5
#include <fstream>
#include <string>

using namespace std;

int main()
{
    ifstream f1("f1.dat");
    ofstream f2("f2std.dat");
    string line;
    while(f1 && getline(f1,line))
    {
        f2 << line << endl;
    }
    f1.close();
    f2.close();
    return 0;
}
Avatar billede arne_v Ekspert
09. april 2007 - 02:44 #6
#using <mscorlib.dll>

using namespace System;
using namespace System::IO;
using namespace System::Text;

int main()
{
    StreamReader ^f1 = gcnew StreamReader("f1.dat", Encoding::Default);
    StreamWriter ^f2 = gcnew StreamWriter("f2dotnet.dat", false, Encoding::Default);
    String ^line;
    while((line = f1->ReadLine()) != nullptr)
    {
        f2->WriteLine(line);
    }
    f1->Close();
    f2->Close();
    return 0;
}
Avatar billede arne_v Ekspert
09. april 2007 - 02:45 #7
det første oversættes med

cl /EHsc

det andet oversættes med

cl /CLR
Avatar billede neocron Nybegynder
09. april 2007 - 13:52 #8
C++.Net console accepterer åbenbart ikke namespace std.
error C2871: 'std' : a namespace with this name does not exist

Jeg lægger desuden mærke til at den laver sine egne "grimme" funktioner, f.eks. hedder main nu

int _tmain(int argc, _TCHAR* argv[])

Hvorfor hedder den ikke bare int main(int argc, char* argv[])?
Jeg kan ikke forstå hvorfor de ændrer sådan noget.

Nå, men tilbage til problemet.

Jeg har en standard console application i C++.Net, og hvis jeg skriver:

#include <fstream>
#include <string>
#include "stdafx.h"

// using namespace std; <kan ikke finde "std">

int _tmain(int argc, _TCHAR* argv[])
{
    ifstream f1("file.dat");
    ofstream f2("another.dat");
    string line;
    while(f1 && getline(f1, line)) {
        f2 << line << endl;
    }
    f1.close();
    f2.close();
}

Hvis jeg forsøger at compile dette får jeg intet mindre end 13 fejl:

Error    1    error C2065: 'ifstream' : undeclared identifier
Error    2    error C2146: syntax error : missing ';' before identifier 'f1'
Error    3    error C3861: 'f1': identifier not found
Error    4    error C2065: 'ofstream' : undeclared identifier
Error    5    error C2146: syntax error : missing ';' before identifier 'f2'
Error    6    error C3861: 'f2': identifier not found
Error    7    error C2065: 'string' : undeclared identifier
Error    8    error C2146: syntax error : missing ';' before identifier 'line'
Error    9    error C2065: 'line' : undeclared identifier
Error    10    error C3861: 'getline': identifier not found
Error    11    error C2065: 'endl' : undeclared identifier
Error    12    error C2228: left of '.close' must have class/struct/union
Error    13    error C2228: left of '.close' must have class/struct/union

Jeg kan heller ikke rigtig finde stedet hvor man compiler med cl /EHsc osv. Troede det var: Project -> <projekt> Properties -> C/C++ -> Command Line -> Additional Options. Det var det ikke :) Ihvertfald virker det ikke, da jeg forsøgte fik jeg iflg. fejl:

Error    1    fatal error C1083: Cannot open source file: 'cl': No such file or directory
Avatar billede arne_v Ekspert
09. april 2007 - 16:22 #9
Jeg har compilet 09/04-2007 02:44:34 med VS 2005.

Men altsaa command line !

Start menu,...,Visual C++,...,command prompt

og

cl /EHsc foobar.cpp

simpelt.

Jeg kan godt proeve og finde ud af hvordan man goer det samme inde fra IDE'en.
Avatar billede arne_v Ekspert
09. april 2007 - 16:32 #10
int _tmain(int argc, _TCHAR* argv[])

er et trick for at kunne compile samme source code til baade ANSI og Unicode
tegn saet
Avatar billede neocron Nybegynder
09. april 2007 - 20:48 #11
Et eller andet er ihvertfald gået helt galt under installationen af Visual Studio 2005 for mig, cl.exe mangler "mspdb80.dll" og kan derfor ikke starte. Det kører bare :)

Hvis du kan finde ud af hvor man i IDE'et sætter den parameter, ville det da være dejligt.
Avatar billede neocron Nybegynder
09. april 2007 - 20:53 #12
Ah.. jeg har fikset det manglende .dll problem.
Der skulles tilføjes en sti til PATH miljøvariablen til C:\Program Files\Microsoft Visual Studio 8\Common7\IDE. Nu kan cl.exe køres.
Avatar billede arne_v Ekspert
10. april 2007 - 04:45 #13
2005 Express

Win32 - Win32 Console Application
not use precompiled header files

#include "stdafx.h"

#include <fstream>
#include <string>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    ifstream f1("f1.dat");
    ofstream f2("f2std.dat");
    string line;
    while(f1 && getline(f1,line))
    {
        f2 << line << endl;
    }
    f1.close();
    f2.close();
    return 0;
}

virker hos mig !
Avatar billede arne_v Ekspert
10. april 2007 - 04:46 #14
følgende gør også:

#include <fstream>
#include <string>

using namespace std;

int main()
{
    ifstream f1("f1.dat");
    ofstream f2("f2std.dat");
    string line;
    while(f1 && getline(f1,line))
    {
        f2 << line << endl;
    }
    f1.close();
    f2.close();
    return 0;
}
Avatar billede neocron Nybegynder
10. april 2007 - 21:08 #15
Nu lader det endelig til at virke.
Jeg skal dog bruge "" omkring mine includes (#include "fil.h").
Jeg kan ikke bruge #include <fil>.
Det er vel overkommeligt.

Jeg synes det er sjovt - hvis jeg undlader "stdafx.h" vil ALT gå amok og generere fejl ad libitum. Den går også amok hvis den ikke er den FØRSTE include. Hvorfor autogenereres denne? Bør jeg tilføje mine includes i den, eller hvad er meningen?

Smid i øvrigt et svar, du har været til stor hjælp :)

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//

#pragma once

#ifndef _WIN32_WINNT        // Allow use of features specific to Windows XP or later.                 
#define _WIN32_WINNT 0x0501    // Change this to the appropriate value to target other versions of Windows.
#endif                       

#include <stdio.h>
#include <tchar.h>
Avatar billede arne_v Ekspert
10. april 2007 - 21:29 #16
har du sat:

not use precompiled header files

?
Avatar billede arne_v Ekspert
10. april 2007 - 21:34 #17
det er en MS specialitet til at speede compilering op

jeg ville undgaa at bruge det

og et svar
Avatar billede neocron Nybegynder
10. april 2007 - 22:06 #18
Det nærmeste jeg kommer på "not use precompiled header files" er et afkrydsningsfelt under oprettelse af projektet, "Precompiled header". Det lader ikke til at gøre nogen forskel om der er flueben i dette eller ej. Det kan godt være jeg kigger det helt forkerte sted ;)

Hvis jeg browser MSDN finder jeg kun denne, som jeg intet forstår af - udover at det med garanti er det stik modsatte af hvad jeg skal finde:

property pchOption UsePrecompiledHeader {
    pchOption get ();
    void set ([InAttribute] pchOption optSetting);
}

http://msdn2.microsoft.com/en-us/library/microsoft.visualstudio.vcprojectengine.vcclcompilertool.useprecompiledheader(VS.80).aspx
Avatar billede neocron Nybegynder
10. april 2007 - 22:12 #19
Måske det netop var det. Efter lidt søgen fandt jeg den sagnopspundne Not Use Precompiled Headers.

Project Properties -> Property Pages -> Configuration Properties -> C/C++ -> Precompiled Headers. Den står til "Not Using Precompiled Headers".
Avatar billede arne_v Ekspert
10. april 2007 - 22:47 #20
hvis den staar saadan saa burde du kunne slette

#include "stdafx.h"
Avatar billede neocron Nybegynder
11. april 2007 - 00:47 #21
Jeps, nu brokker den sig ikke længere hvis man fjerner referencen til stdafx.h. Dejligt :) Så kan man passende til mine småprojekter holde det meste i én central header fil.

Jeg takker mange gange for hjælpen og tålmodigheden!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester