Avatar billede d34c0n Praktikant
03. oktober 2002 - 18:32 Der er 12 kommentarer og
1 løsning

Tekstdokumenter ..............

Hej.
Jeg mangler noget kode til hvordan jeg kan læse og skrive til en bestemt linie i en tekstfil (*.txt).
F.eks. vil jeg kunne læse linie 7 i et edit-felt og kunne ændre linien og gemme dokumentet.

Hvis jeg kunne få sendt et samlet projekt med dette, ville det være fedt!!!
PS. Jeg bruger Microsoft VC++.
Og det skal være en Windows-applikation!!!

Tak!

E-mail: deacon@mail.dk
Avatar billede skrewz Nybegynder
03. oktober 2002 - 18:35 #1
hvad med go'e gamle fopen?
Avatar billede jpk Nybegynder
04. oktober 2002 - 08:40 #2
15 point for et færdigt projekt er nu ikke meget...

Skal det nødvendigvis være til nogle bestemte linier i tekstfilen, eller er det bare en konfigurationsfil med nogle indstillinger?
Avatar billede d34c0n Praktikant
04. oktober 2002 - 09:28 #3
jeg kan godt øge de points hvis det er nødvendigt.
hmmm... ja det skal være fra en .cfg-fil hvor den skal læse en bestemt linie og kunne ændre den!!
Avatar billede jpk Nybegynder
04. oktober 2002 - 09:43 #4
Nu bruges extension cfg jo til mange forskellige formater, hvordan ser indholdet ud i din fil?
Avatar billede soepro Nybegynder
04. oktober 2002 - 10:13 #5
Vi har behandlet noget der ligner under http://www.eksperten.dk/spm/265299 - mon ikke du kan bruge det. StringList version stiller jo i og for sig ikke nogle specielle krav til formatet af data-ene i filen.

Hvis du kender linienummeret, kan du jo lave noget der ligner:

TStringList StringList = new CStringList();

StringList->LoadFromFile("C:\\mysettings.cfg");

String gammelVaerdi = StringList->Strings[linienummer];
StringList->Strings[linienummer] = "Ny værdi";

StringList->SaveToFile("C:\\mysettings.cfg");
Avatar billede d34c0n Praktikant
04. oktober 2002 - 10:22 #6
Jeg bruger VC++!!!
Avatar billede d34c0n Praktikant
04. oktober 2002 - 10:23 #7
soepro> ellers kunne jeg jo gøre det i delphi :)
Avatar billede jpk Nybegynder
04. oktober 2002 - 10:29 #8
Prøv nu at poste indholdet (eller en del) af filen, så vi kan se hvad vi har med at gøre...
Avatar billede d34c0n Praktikant
04. oktober 2002 - 10:37 #9
jpk : jeg er ikke hjemme nu, men jeg skal nok gøre det her senere i dag!
Avatar billede jpk Nybegynder
04. oktober 2002 - 10:54 #10
Hvis filen er af samme type, som nedenstående eksempel, findes der metoder til at håndtere det.

// Eksempel på indhold

[Settings]
Val1=A
Val2=B
Val3=C


Du kan så bruge metoderne GetPrivateProfileString & WritePrivateProfileString:

// Læse
TCHAR Buffer[10];
GetPrivateProfileString("Settings", "Val1", "", sizeof(Buffer), "MyFile.cfg"); // Buffer indeholder så værdien af Val1 ('A')

// Skrive
WritePrivateProfileString("Settings", "Val1", "D", "MyFile.cfg"); // Val1 har nu værdien 'D'
Avatar billede d34c0n Praktikant
05. oktober 2002 - 00:37 #11
jpk : det er det ikke!
her er noget af starten i min cfg-fil:

unbindall
bind "TAB" "+showscores"
bind "ENTER" "+attack"
bind "ESCAPE" "cancelselect"
bind "SPACE" "+jump"
bind "'" "+moveup"
bind "+" "sizeup"
bind "," "buyammo1"
bind "-" "sizedown"
bind "." "buyammo2"
bind "/" "+movedown"
bind "0" "slot10"
bind "1" "slot1"
bind "2" "slot2"
bind "3" "slot3"
bind "4" "slot4"
bind "5" "slot5"
bind "6" "slot6"
bind "7" "slot7"
bind "8" "slot8"
bind "9" "slot9"
bind ";" "+mlook"
bind "=" "sizeup"
bind "[" "invprev"
bind "]" "invnext"
bind "`" "toggleconsole"
bind "a" "+moveleft"
bind "b" "buy"
bind "c" "radio3"
Avatar billede d34c0n Praktikant
05. oktober 2002 - 00:38 #12
og så vil jeg kunne fx ændre den der hedder bind "0" "slot10" - ændre til :
bind "0" + det_brugeren_vaelger
Avatar billede soepro Nybegynder
07. oktober 2002 - 10:03 #13
Det nemmeste er nok at lave en midlertidig fil, flushe indholdet af den originale derover i, fjerne orginalen, og rename den gamle:

#include <stdio.h>
#include <conio.h>

int main(void)
{
  FILE *inpFile;
  FILE *outpFile;
  int  lineCount;
  char  buffer[256];
  char *nyLinie = "Denne linie skal sættes ind på linie 10.";

  if ((inpFile = fopen("C:\\gl_fil.txt", "rt")) == NULL
  || ((outpFile = fopen("C:\\ny_fil.txt", "wt")) = NULL)
    return -1;

  lineCount = 0;
  while (fgets(buffer, sizeof(buffer)-1, inpFile) != NULL)
  {
    if (++lineCount == 10)
      fputs(outpFile, nyLinie);
    else
      fputs(outpFile, buffer);
  };

  fclose(outpFile);
  fclose(inpFile);

  // Slet originale
  remove("C:\\gl_fil.txt");
  rename("C:\\ny_fil.txt", "C:\\gl_fil.txt");
  return 0;
}

Eller noget i den stil. Alternativt skal du selv implementere en egen StringList med tilhørende funktioner:

class CStringNode
{
  public:
  String      data;
  CStringNode(String s) { data = s; };
  CStringNode(void) { CStringNode(""); };
};
class CStringList
{
  public:
  int          Count;
  CStringNode *Items[] = NULL;
  void        Clear(void);
  int          Add(String value);
  int          LoadFromFile(String file);
  int          SaveToFile(String file);
};

void CStringList::Clear(void)
{
  if (Items != NULL)
  {
    for (;Count >= 0; Count--)
      delete Items[Count];
  };
  Count = 0;
}
int CStringList::Add(String s)
{
  Items[Count++] = new CStringNode(s);
  return Count;
}
int LoadFromFile(String file)
{
  char  buffer[257];
  FILE *inPFile;

  Clear();
  if ((inpFile = fopen(file.c_str(), "rt")) == NULL)
    return Count;
  while (fgets(buffer, sizeof(buffer)-1, inpFile) != NULL)
    Add((String)buffer);
  fclose(inpFile);
  return Count;
}
int CStringList::SaveToFile(String file)
{
  FILE *outFile;

  if ((outFile = fopen(file.c_str(), "wt")) == NULL)
    return -1;

  for (idx = 0; idx < Count; idx++)
    fputs(Items[idx], outFile);
  fclose(outFile);
  return Count;
}
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