Avatar billede rasmus-madsen Nybegynder
26. september 2004 - 01:21 Der er 28 kommentarer og
1 løsning

Fejl i denne sætning ?

Hvad er fejlen i denne :
  fra = "c:\\Documents and Settings\\" << navn << "\\";
Avatar billede bertelbrander Novice
26. september 2004 - 01:54 #1
Hvad er fra og navn ?

Måske:
#include <string>
#include <iostream>

int main()
{
  char *navn = getenv("USERNAME");
  std::string fra = "c:\\Documents and Settings\\" + std::string(navn) + "\\";
  std::cout << fra << std::endl;
}
Avatar billede arne_v Ekspert
26. september 2004 - 10:05 #2
Eller stringstream:

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main()
{
  char *navn = getenv("USERNAME");
  stringstream fra;
  fra << "c:\\Documents and Settings\\" << navn << "\\";
  cout << fra.str().c_str() << endl;
}

eller gode gamle sprintf som i mit oprindelige eksempel.
Avatar billede rasmus-madsen Nybegynder
26. september 2004 - 11:09 #3
har denne her:
  navn = "mappe1";
  navn2 = "mappe2";
  if (nu == navn) {
  fra = "c:\\Documents and Settings\\" << navn << "\\";
  til = "c:\\Documents and Settings\\" << navn2 << "\\";
} else {
  fra = "c:\\Documents and Settings\\" << navn2 << "\\";
  til = "c:\\Documents and Settings\\" << navn << "\\";
}


Og dem her:
    char* til;
    char* fra;
    char* nu;
    char* navn;
    char* navn2;

Skal det så ikke virke ?
Avatar billede arne_v Ekspert
26. september 2004 - 11:26 #4
if (nu == navn) {

skal nok være

if (strcmp(nu,navn)==0) {
Avatar billede arne_v Ekspert
26. september 2004 - 11:28 #5
char til[MAX_PATH];
char fra[MAX_PATH];
...
sprintf(fra,"c:\\Documents and Settings\\%s\\",navn);
sprintf(til,"c:\\Documents and Settings\\%s\\",navn2);

men det kan laves på mange måder !
Avatar billede rasmus-madsen Nybegynder
26. september 2004 - 11:33 #6
Jeg har brugt alt det der...
if (strcmp(nu,navn)==0) {
char til[MAX_PATH];
char fra[MAX_PATH];
sprintf(fra,"c:\\Documents and Settings\\%s\\",navn);
sprintf(til,"c:\\Documents and Settings\\%s\\",navn2);

Men det giver ingen fejl i programmet men fejl når man kører det.
invalid file handle. getlasterror reports:3
Siger det dig noget ?
Avatar billede arne_v Ekspert
26. september 2004 - 11:35 #7
Jeg er ret sikker på at

char til[MAX_PATH];
char fra[MAX_PATH];

skal udenfor if

Men ellers skal vi nok se noget kode
Avatar billede rasmus-madsen Nybegynder
26. september 2004 - 11:37 #8
ups den er også udenfor..
hele koden kommer her..:
#include <windows.h>
#include <fstream.h>
#include <stdlib.h>
#include <string>
#include <iostream>
using namespace std;

void DoCopy(std::string aSrc, std::string aDest, FILETIME &aSrcFileTime)
{
  WIN32_FIND_DATA FindFileData;
  HANDLE hFind = FindFirstFile(aDest.c_str(), &FindFileData);
  if(hFind != INVALID_HANDLE_VALUE &&
      CompareFileTime(&aSrcFileTime, &FindFileData.ftLastWriteTime) < 0)
  {
      std::cout << "Dest is newer than source: " << aSrc << std::endl;
      return;
  }
  if(!CopyFile(aSrc.c_str(), aDest.c_str(), false))
      std::cerr << "Failed to copy: " << aSrc << std::endl;
  else
      std::cout << aSrc << std::endl;
}

void DoScan(std::string aSrc, std::string aDest)
{
  std::string SrcPattern = aSrc + "*";
  WIN32_FIND_DATA FindFileData;
  HANDLE hFind = FindFirstFile(SrcPattern.c_str(), &FindFileData);
  if (hFind == INVALID_HANDLE_VALUE)
  {
    std::cerr << "Invalid File Handle. GetLastError reports: " <<  GetLastError() << std::endl;
    return;
  }
  else
  {
    CreateDirectory(aDest.c_str(), 0);
    do
    {
        if(!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
        {
          DoCopy(aSrc + FindFileData.cFileName, aDest + FindFileData.cFileName, FindFileData.ftLastWriteTime);
        }
        else if(strcmp(FindFileData.cFileName, ".") && strcmp(FindFileData.cFileName, ".."))
          DoScan(aSrc + std::string(FindFileData.cFileName) + "\\", aDest + std::string(FindFileData.cFileName) + "\\");
    }
    while(FindNextFile(hFind, &FindFileData));
    FindClose(hFind);
  }
}

int main(void)
{
    int lineno;
char til[MAX_PATH];
char fra[MAX_PATH];
    char* nu;
    char* navn;
    char* navn2;
  char buffer[100][256];
  ifstream examplefile ("data.txt");
  if (! examplefile.is_open())
  {
      cout << "Error opening file";
      exit (1);
  }
  lineno = 0;
  while (! examplefile.eof() )
  {
      examplefile.getline (buffer[lineno],sizeof(buffer[lineno]));
      lineno++;
  }

  nu = "mappe1";
  navn = "mappe1";
  navn2 = "mappe2";
if (strcmp(nu,navn)==0) {
sprintf(fra,"c:\\Documents and Settings\\%s\\",navn);
sprintf(til,"c:\\Documents and Settings\\%s\\",navn2);
} else {
sprintf(fra,"c:\\Documents and Settings\\%s\\",navn2);
sprintf(til,"c:\\Documents and Settings\\%s\\",navn);
}       
  cout << fra;
  DoScan(fra, til);
  return EXIT_SUCCESS;
}
Avatar billede arne_v Ekspert
26. september 2004 - 11:43 #9
Prøv og udskriv SrcPattern inden du kalder FindFirstFile
Avatar billede arne_v Ekspert
26. september 2004 - 11:44 #10
Måske er det blandingen af char array og std::string som driller
Avatar billede rasmus-madsen Nybegynder
26. september 2004 - 11:47 #11
Det kan jeg ikke få lov til.. Den vil ikke complikere..
cout << SrcPattern;
Avatar billede arne_v Ekspert
26. september 2004 - 11:48 #12
cout << SrcPattern.c_str() << endl;
Avatar billede rasmus-madsen Nybegynder
26. september 2004 - 11:49 #13
Ups har fundet fejlen ..
Avatar billede rasmus-madsen Nybegynder
26. september 2004 - 11:50 #14
det var fordi jeg havde glemt at oprette mapperne :D ..

Kan man ikke lave en forspørgsel på det ? Altså om mappen eksitere. ?
Avatar billede arne_v Ekspert
26. september 2004 - 11:53 #15
Er det ikke det som du tester på med:

if (hFind == INVALID_HANDLE_VALUE)

(til directories oprettes jo)
Avatar billede rasmus-madsen Nybegynder
26. september 2004 - 11:55 #16
hmm ved squ ikke... men det virker :) ...

Smid et svar !
Avatar billede arne_v Ekspert
26. september 2004 - 11:58 #17
kommer her

spørge bare igen her hvis der dukker problemer op
Avatar billede arne_v Ekspert
26. september 2004 - 11:58 #18
jeg prøver at ramme den lille cirkel ude til venstre igen

:-)
Avatar billede rasmus-madsen Nybegynder
26. september 2004 - 12:00 #19
det lyder godt :)
Avatar billede rasmus-madsen Nybegynder
26. september 2004 - 12:03 #20
jeg har faktisk et spm mere... er det okay ?
Avatar billede arne_v Ekspert
26. september 2004 - 12:42 #21
ja
Avatar billede arne_v Ekspert
26. september 2004 - 12:46 #22
Avatar billede arne_v Ekspert
26. september 2004 - 12:47 #23
Samme problem som her.

Du skal enten bruge std::string og + eller formatere strengen først med
stringstream eller sprintf.
Avatar billede rasmus-madsen Nybegynder
26. september 2004 - 12:49 #24
Nemer du sådan her ?
  std::DoScan(fra + "skrivebord\\", til + "skrivebord\\");

Det giver nemlig fejl..
Avatar billede arne_v Ekspert
26. september 2004 - 12:51 #25
Hvad med:

DoScan(std::string(fra) + "skrivebord\\", std::string(til) + "skrivebord\\");
Avatar billede rasmus-madsen Nybegynder
26. september 2004 - 12:57 #26
det virker ..

Vil du have pointsne i det andet spm ?
Avatar billede arne_v Ekspert
26. september 2004 - 13:11 #27
Ikke nødvendigt.

I modsætning til Bertel deltager heg i point ræset.

Men jeg har vist fået point nok fra dig lige her og nu.
Avatar billede arne_v Ekspert
26. september 2004 - 13:11 #28
heg = jeg
Avatar billede arne_v Ekspert
26. september 2004 - 13:13 #29
Men du skal være meget opmærksom på om noget er

char [] - så er det et array af chars som kan mainupleres med strxxx og sprintf
char * - så er der noget der peger på et array af chars (ofte kan det og char []
bruges samme steder, men char * kan pege på en kosntant som man ikke kan ændre)
string eller std::string - er et objekt som har nogle smarte metoder og
overloadede operatorer
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