/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
C++ - hent fra fil, ret, og lig tilbage i ~
Fra : Trine Kornum Christi~


Dato : 29-03-02 18:34

Hej

Jeg har et lille problem, som jeg gerne vil have lidt hjælp til.

Jeg skal have fundet ud af hvordan jeg henter noget data fra en fil og
skriver det ud på skærmen, ændrer i det og stopper det tilbage i filen
igen. Så hvis man er tilfreds med det der bliver skrevet ud, så skal man
bare trykke return igen, og så bliver det samme stoppet tilbage i filen
igen. Tilsvarende, hvis der skal ændres, så skal man kunne trykke
backspace og rette i det eller gå ind i midten og ændre en karakter.

Jeg håber at jeg har formuleret mig tydeligt nok.

Mvh Trine

 
 
Igor V. Rafienko (29-03-2002)
Kommentar
Fra : Igor V. Rafienko


Dato : 29-03-02 21:58

[ Trine Kornum Christiansen ]

[ snip ]

> Jeg skal have fundet ud af hvordan jeg henter noget data fra en fil
> og skriver det ud på skærmen, ændrer i det og stopper det tilbage i
> filen igen. Så hvis man er tilfreds med det der bliver skrevet ud,
> så skal man bare trykke return igen, og så bliver det samme stoppet
> tilbage i filen igen. Tilsvarende, hvis der skal ændres, så skal man
> kunne trykke backspace og rette i det eller gå ind i midten og ændre
> en karakter.
>
> Jeg håber at jeg har formuleret mig tydeligt nok.


Jovisst har du det.

Tips1: ingen kommer til å gjøre leksene dine for deg.

Tips2: vis hva _du_ har forsøkt _selv_ _først_, så får du råd. Det
fungerer ikke den andre veien.

Tips3: Dette vil kreve ikke-trivielle terminal IO, noe som lar seg
vanskelig gjøre portabelt. Hvilken platform satt du på igjen?





ivr, obligtider?
--
If the Americans want the gold medals this bad, then our Mint should
stamp some and hand them over.
      -- G. Raikov, 2002-02-22 on Salt Lake City Olympics

Trine Kornum Christi~ (30-03-2002)
Kommentar
Fra : Trine Kornum Christi~


Dato : 30-03-02 08:17

"Igor V. Rafienko" wrote:
>
> [ Trine Kornum Christiansen ]
>
> [ snip ]
>
> > Jeg skal have fundet ud af hvordan jeg henter noget data fra en fil
> > og skriver det ud på skærmen, ændrer i det og stopper det tilbage i
> > filen igen. Så hvis man er tilfreds med det der bliver skrevet ud,
> > så skal man bare trykke return igen, og så bliver det samme stoppet
> > tilbage i filen igen. Tilsvarende, hvis der skal ændres, så skal man
> > kunne trykke backspace og rette i det eller gå ind i midten og ændre
> > en karakter.

[snip]

> Tips1: ingen kommer til å gjøre leksene dine for deg.

For det første så er det her ikke lektier, men for sjov. Mine lektier
klarer jeg fint selv.

> Tips2: vis hva _du_ har forsøkt _selv_ _først_, så får du råd. Det
> fungerer ikke den andre veien.

For det andet så ville jeg ikke kede jer med mine forsøg på at få det
til at virke. Men den eneste metode til at skrive på skærmen, der står
nævnt i min C++-bog, C++ How to program, Deitel & Deitel, er cout, der
står godt nok også andre metoder, men de har ikke noget som helst med
det her at gøre.

> Tips3: Dette vil kreve ikke-trivielle terminal IO, noe som lar seg
> vanskelig gjøre portabelt. Hvilken platform satt du på igjen?

Jeg skriver i Emacs, kompilerer med cygwin/gnus, og bruger en
win2000-maskine.

Det var ikke for at få en løsning jeg skrev, men for at få at vide hvor
jeg læse noget og om der var nogen der måske kunne give et hint. Det kan
jo også være at jeg simpelthen ikke ved nok til at kunne løse problemet
selv endnu.

Mvh Trine

Trine Kornum Christi~ (30-03-2002)
Kommentar
Fra : Trine Kornum Christi~


Dato : 30-03-02 10:08

Trine Kornum Christiansen wrote:
>
> Hej
>
> Jeg har et lille problem, som jeg gerne vil have lidt hjælp til.
>
> Jeg skal have fundet ud af hvordan jeg henter noget data fra en fil og
> skriver det ud på skærmen, ændrer i det og stopper det tilbage i filen
> igen. Så hvis man er tilfreds med det der bliver skrevet ud, så skal man
> bare trykke return igen, og så bliver det samme stoppet tilbage i filen
> igen. Tilsvarende, hvis der skal ændres, så skal man kunne trykke
> backspace og rette i det eller gå ind i midten og ændre en karakter.
>
> Jeg håber at jeg har formuleret mig tydeligt nok.

Jeg kan lige se at jeg ikke har formuleret mig tydelig nok. Problemet er
ikke at skrive til og fra filen, det er nemt nok, problemet er at kunne
skrive ud på skærmen og kunne ændre i det med backspace, piletaster osv.

for (int i = 0 ; i < 100 ; i++ )
{
updateFile.seekg( i * sizeof( clientData ) );

clientData client;

updateFile.read( reinterpret_cast<char *>( &client ),
          sizeof( clientData ) );

if (client.kortnummer == account)
   {
    outputLine( cout, client );
    cout << "Antal loginforsoeg: " << client.login;
    cin >> client.login;

De to ovenstående linier er de aktuelle. Her skriver jeg client.login ud
på skærmen, brugeren skal så skrive det ændrede client.login via
tastaturet og jeg tager det så ind igen med en cin. Det er så meningen
at brugeren i stedet for skal ændre i det der bliver skrevet ud på
skærmen, så hvis han/hun er tilfreds med det eksisterende client.login,
så skal der tages det samme ind som der blev skrevet ud.

Nu håber jeg at jeg har formuleret mig tydeligt nok.

Mvh Trine

Martin Dyring (30-03-2002)
Kommentar
Fra : Martin Dyring


Dato : 30-03-02 14:02

"Trine Kornum Christiansen" <tkc@mail.dk> wrote in message
news:3CA5807E.16B3196D@mail.dk...
> outputLine( cout, client );
> cout << "Antal loginforsoeg: " << client.login;
> cin >> client.login;
>
> De to ovenstående linier er de aktuelle. Her skriver jeg client.login ud
> på skærmen, brugeren skal så skrive det ændrede client.login via
> tastaturet og jeg tager det så ind igen med en cin. Det er så meningen
> at brugeren i stedet for skal ændre i det der bliver skrevet ud på
> skærmen, så hvis han/hun er tilfreds med det eksisterende client.login,
> så skal der tages det samme ind som der blev skrevet ud.
>
> Nu håber jeg at jeg har formuleret mig tydeligt nok.

Hej Trine,

Det du ønsker at lave kan som sådan sagtens lade sig gøre. Du skal bare være
opmærksom på at løsningen bliver ret platforms/compiler-specifik.

Jeg er lidt rusten i det her, men du skal bruge noget i stil med:

1) En funktion til at læse et "tegn" fra tastaturet
2) Et par funktioner der kan placere cursoren et givet sted på skærmen, samt
skrive fra denne cursor position

Så kan du klaske noget sammen der minder om følgende (der burde give dig en
generel ide om hvordan det kunne laves):

std::string hjemmestrikket_readline(const std::string &input)
{
std::string text(input);
gem_cursor_position();
loop
{
gå_til_gemt_cursor_position;
skriv(text); // Skriv tekst til skærmen, sørg for at overskrive hele
feltet (i tilfælde af at folk bruger backspace)
char c = getch(); // Læs tegn fra tastaturet
switch(c)
{
case 13: // Linieskift - vi er færdige med at læse linien
return text;
case 8: // Backspace - fjern det bagerste tegn
text.erase(text.size() - 1);
break;
default:
text += c;
}
}
}

Overstående kan så udvides hvis man vil have mulighed for at flytte cursoren
rundt i input-feltet osv.

--
Mvh,
Martin Dyring




Claus Rasmussen (30-03-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 30-03-02 22:51

Trine Kornum Christiansen wrote:

> for (int i = 0 ; i < 100 ; i++ )
> {
> updateFile.seekg( i * sizeof( clientData ) );
>
> clientData client;
>
> updateFile.read( reinterpret_cast<char *>( &client ),
> sizeof( clientData ) );
>
> if (client.kortnummer == account)
> {
> outputLine( cout, client );
> cout << "Antal loginforsoeg: " << client.login;
> cin >> client.login;

Nydelig kode for en nybegynder Men det, du har gang i, er ikke så
nemt.

For det første kan du slet ikke bruge cout/cin hvis du vil give brugerne
mulighed for at editere deres input. cout og cin er mest beregnet til
stream's (dvs. filer) og dur' ikke rigtigt til at styre en terminal.

For det andet er input og output som regel buffered. Dvs. at maskinen
lagrer tegnene i en buffer før den giver dem videre til dig. Når input
kommer fra en terminal afsluttes bufferen som regel først, når brugeren
har trykket ENTER på tastaturet. Dvs at du ikke ser tryk på piletasterne
før det er for sent.

Hvis Windows er indrettet lige som linux, som jeg sidder med her, så
er der yderligere den komplikation, at bufferingen sker på to niveauer:
Det ene er C/C++'s egen buffer (som du kan slå fra med et kald til
setbuf - se nedenfor). Det andet er på systemniveau, hvor du skal til
at rode med ioctl's (som er noget forfærdeligt noget), for at få det
til at virke.

For det tredje er tastetryk ikke bare enkelttegn. Backspace og newline
er, men piletasterne sender som regel sekvenser af tegn. Du kan teste
det med et lille program:

#include <stdio.h>
#include <iostream>

int main() {
int c; // getchar returnerer en int. EOF er lig med -1

setbuf(stdin, 0); // Unbuffered input

while (1) {
c = getchar();
cout << c << endl;
}
}

Programmet virker ikke på linux uden at du først får sat den rigtige
ioctl. Men det kan godt være, at det virker på Windows.

Alt i alt er det noget værre noget, du er ved at rode dig ud i Det
bedste er nok at kigge blandt de biblioteker, der følger med til din
compiler på Windows. Prøv at se om der ligger noget med navnene curses.h,
ncurses.h, conio.h, termio.h eller lignende og forbered dig på en del
manuallæsning.

-Claus


Trine Kornum Christi~ (31-03-2002)
Kommentar
Fra : Trine Kornum Christi~


Dato : 31-03-02 12:00

[snip]

> Alt i alt er det noget værre noget, du er ved at rode dig ud i Det
> bedste er nok at kigge blandt de biblioteker, der følger med til din
> compiler på Windows. Prøv at se om der ligger noget med navnene curses.h,
> ncurses.h, conio.h, termio.h eller lignende og forbered dig på en del
> manuallæsning.

Det lyder som om jeg skal nøjes med en mindre smart løsning, så som, at
hvis der skal ændres, så skal man skrive det hele, og hvis der ikke skal
ændres, så kan man nøjes med at skrive et eller andet tegn, som der ikke
naturligt eksisterer i det der skal tastes ind.

Men tak for hjælpen, det kan være at jeg vender tilbage til svaret når
jeg når lidt længere med C++.

Mvh Trine

Morten Brix Pedersen (04-04-2002)
Kommentar
Fra : Morten Brix Pedersen


Dato : 04-04-02 19:02

Claus Rasmussen wrote:
> For det første kan du slet ikke bruge cout/cin hvis du vil give brugerne
> mulighed for at editere deres input. cout og cin er mest beregnet til
> stream's (dvs. filer) og dur' ikke rigtigt til at styre en terminal.

Hvorfor? Din getchar() løsning kan erstattes med cin ved at bruge cin.get().

Desuden kan man altid bruge getline(cin, enString); hvis man bare vil
have en linje fra brugeren, uden at checke for hvilken type han indtastede.


- Morten.


Claus Rasmussen (04-04-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 04-04-02 19:14

Morten Brix Pedersen wrote:

> Claus Rasmussen wrote:
>
>> For det første kan du slet ikke bruge cout/cin hvis du vil give brugerne
>> mulighed for at editere deres input. cout og cin er mest beregnet til
>> stream's (dvs. filer) og dur' ikke rigtigt til at styre en terminal.
>
> Hvorfor? Din getchar() løsning kan erstattes med cin ved at bruge
> cin.get().

Du får svært ved at skubbe et flyt-cursor-til-position-7-tegn eller
et slet-tegn-nummer-3-og-ryk-resten-til-venstre-tegn ned gennem cin.get
(og getchar for den sags skyld).

Man /kan/ godt, men hvis en newbie skal igennem et mindre ASCII Escape
control sequences kursus for at editere en tekst, så vil jeg mene, at
der var nemmere at kigge sig om efter et simpelt library til at klare
tingene i stedet.

Men hovedproblemet med cin og cout er at de er buffered. Så kan du
naturligvis flushe for hvert tegn, du skriver, men jeg vil bestemt
ikke kalde cin og cout for velegnet til formålet.

-Claus


Morten Brix Pedersen (04-04-2002)
Kommentar
Fra : Morten Brix Pedersen


Dato : 04-04-02 19:25

Claus Rasmussen wrote:
> Morten Brix Pedersen wrote:
>>Claus Rasmussen wrote:
>>>For det første kan du slet ikke bruge cout/cin hvis du vil give brugerne
>>>mulighed for at editere deres input. cout og cin er mest beregnet til
>>>stream's (dvs. filer) og dur' ikke rigtigt til at styre en terminal.
>>
>>Hvorfor? Din getchar() løsning kan erstattes med cin ved at bruge
>>cin.get().
>
>
> Du får svært ved at skubbe et flyt-cursor-til-position-7-tegn eller
> et slet-tegn-nummer-3-og-ryk-resten-til-venstre-tegn ned gennem cin.get
> (og getchar for den sags skyld).

Oh - sorry. Jeg læste vist det tidligere indlæg lidt for hurtigt. Jeg
kiggede bare på at du frarådede cin/cout hvorefter du gav et eksempel
som cin sagtens kunne klare :)

My bad.

- Morten.


Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408514
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste