raphidue
Goto Top

Anzahl Zeichen eine Zeile herausfinden.

Hallo zusammen,
ich benötige eine Funktion mit der ich ermitteln kann wieviel Zeichen in einer Zeile sind. Da ich gerade einen Hänger habe und nicht weiterkomme möchte ich hier fragen.

Meine While-Schleife:
while (fgets(current_line, C_value + 1, stdin) != NULL)
Diese liet von der Eingabe(stdin) eine Anzahl von Zeichen ein, die Anzahl der Zeichen die eingelesen werden, wird durch "C_value+1" bestimmt. Maximal ließt diese Schleife jeweils bis zu einem Newline oder EOF.

Nun möchte ich herausfinden wieviele Zeichen die Zeile tatsächlich hat.
In Prinzip möchte ich es einfach irgndwie anstellen womit ich abfragen kann wieviele Zeichen die Zeile tatsächlich hat, sodass ich diese Abfrage machen kann:
if(C_value < ANZAHLZEICHENDERZEILE) 
.

Vielen Dank
Greeze raphidue

Content-Key: 186305

Url: https://administrator.de/contentid/186305

Printed on: April 25, 2024 at 23:04 o'clock

Member: Kaioshin
Kaioshin Jun 11, 2012 at 21:30:35 (UTC)
Goto Top
Hallo raphidue

Folgendes Beispiel:

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

int main() {
	string input;
	cout << "Zeile eingeben: ";  
	getline(cin, input);
	cout << "Länge: " << input.size() << endl;  

	return 0;
}

Eingelesen wird mit der getline() Funktion und die Länge des Strings wird mit der Funktion size() ausgelesen.
Löst das vieleicht dein Problem?


Kaioshin
Member: raphidue
raphidue Jun 11, 2012 at 21:44:00 (UTC)
Goto Top
Zitat von @Kaioshin:
Hallo raphidue

Folgendes Beispiel:

> #include <iostream>
> #include <string>
> using namespace std;
> 
> int main() {
> 	string input;
> 	cout << "Zeile eingeben: ";  
> 	getline(cin, input);
> 	cout << "Länge: " << input.size() << endl;  
> 
> 	return 0;
> }
> 
> 

Eingelesen wird mit der getline() Funktion und die Länge des Strings wird mit der Funktion size() ausgelesen.
Löst das vieleicht dein Problem?


Kaioshin

Ich bräuchte das Ganze in Ansi C face-smile
Member: rubberman
rubberman Jun 11, 2012 at 22:41:14 (UTC)
Goto Top
Hallo raphidue,

da du mit fgets() ja gerade dabei bist eine Zeile aus dem Filestream einzulesen, kannst du nicht vorher schon wissen wie lang die Zeile ist.
Da die Anzahl der eingelesenen Zeichen vom Typ int ist (siehe Funktionsreferenz), kannst du ein Buffer-Array der Länge INT_MAX (limits.h) anlegen.

Anderer Ansatz:
read line from file without knowing the line length

Grüße
rubberman
Member: raphidue
raphidue Jun 11, 2012 at 22:48:29 (UTC)
Goto Top
Zitat von @rubberman:
Hallo raphidue,

da du mit fgets() ja gerade dabei bist eine Zeile aus dem Filestream einzulesen, kannst du nicht vorher schon wissen wie lang die
Zeile ist.
Da die Anzahl der eingelesenen Zeichen vom Typ int ist (siehe Funktionsreferenz), kannst du ein Buffer-Array der Länge
INT_MAX (limits.h) anlegen.

Anderer Ansatz:
[http://stackoverflow.com/questions/2532425/read-line-from-file-without-knowing-the-line-length read line from file without
knowing the line length]

Grüße
rubberman

Ok Danke. Dann versuch ich es mal anders umzuformen, da ich mit dem Wert von C_value ja quasi festlege auf wieviele Zeichen ich mich in einer Zeile beschränke möchtei ich die While schleife nun so abändern dass nur bis zur Anzahl von C_value eingelesen wird alls was danach kommt soll abgeschnitten werden bis die Neue Zeile beginnt. Beispieltext:
Hallo
Text
Falls ich jetzt den C_value (Columns value) auf 3 setze, sollte folgende Zeichen eingelesen werdden:
Hal
Tex
So wie die Whileschleife momentan ist wird das ganze so realisiert:
Hal
lo
Tex
t
Member: rubberman
rubberman Jun 11, 2012 updated at 23:05:12 (UTC)
Goto Top
Hallo raphidue,

die gesamte Zeile einlesen und danach zuschneiden? strncpy() sollte hilfreich sein.

Grüße
rubberman
Member: raphidue
raphidue Jun 12, 2012 updated at 07:13:37 (UTC)
Goto Top
Zitat von @rubberman:
Hallo raphidue,

die gesamte Zeile einlesen und danach zuschneiden? strncpy() sollte hilfreich sein.

Grüße
rubberman

Ich bräuchte einfach eine while -Schleife welches mir nur bis zur einer Schranke die ich angebe (im Obigen Beispiel C_value +1) die Zeilen einließt.
Zum Beispiel folgender INPUT:

Hallo World
Test

benutzerdefinierte Schranke Anzahl Zeichen(C_value) = 3, dann sollen nun folgende Zeichen eingelesen werden:

Hal
Tes

und NICHT!:

Hal
lo
Wor
ld
Tes
t
Member: rubberman
rubberman Jun 12, 2012 updated at 23:06:20 (UTC)
Goto Top
Hallo raphidue,

ich glaube ich hab's verstanden. Der stdin Buffer wird weiter ausgelesen ...
Teste mal Folgendes:
int main(void)
{
  int C_value = 3;
  char current_line[C_value + 1];
  int ch = 0;

  while (fgets(current_line, C_value + 1, stdin) != NULL)
    {
      if(current_line[strlen(current_line) - 1] == '\n')  
        current_line[strlen(current_line) - 1] = '\0';  
      else
        while((ch = getc(stdin)) != '\n' && ch != EOF) continue;  
      printf("___%s___\n", current_line);  
    }
  return 0;
}

Grüße
rubberman

<edit: Buffergröße korrigiert, auf getc() umgeschwenkt />
Member: raphidue
raphidue Jun 13, 2012 at 11:12:35 (UTC)
Goto Top
Zitat von @rubberman:
Hallo raphidue,

ich glaube ich hab's verstanden. Der stdin Buffer wird weiter ausgelesen ...
Teste mal Folgendes:
> int main(void)
> {
>   int C_value = 3;
>   char current_line[C_value + 1];
>   int ch = 0;
> 
>   while (fgets(current_line, C_value + 1, stdin) != NULL)
>     {
>       if(current_line[strlen(current_line) - 1] == '\n')  
>         current_line[strlen(current_line) - 1] = '\0';  
>       else
>         while((ch = getc(stdin)) != '\n' && ch != EOF) continue;  
>       printf("___%s___\n", current_line);  
>     }
>   return 0;
> }
> 

Grüße
rubberman

<edit: Buffergröße korrigiert, auf getc() umgeschwenkt ></edit:>

Danke füer deine Tatkräftige Unterstützung rubberman, ich habe selber eine Lösung gefunden und zwar direkt nach der while(fgets...) diese Abfrage gemacht
if ((strlen (current_line)) == producer_args->C_value)
	{
	  while ((charbuf = getchar ()) != '\n' && charbuf != EOF);  
	}
Member: rubberman
rubberman Jun 13, 2012 updated at 19:04:00 (UTC)
Goto Top
Hallo raphidue,

deine Lösung hat mindestens einen Punkt, bei dem das Ganze nicht so funktioniert, wie du willst. fgets() liest das abschließende '\n' (Enter) mit in das Array. Somit hast du also immer das '\n' in der Variable, wenn die Eingabe kürzer als C_value ist. Wenn das kein Problem darstellt, OK.
Aber wenn die Eingabe genau C_value - 1 lang ist, dann kommt das '\n' als letztes Element im Array ('\0' mal außen vor gelassen). strlen() spuckt dir also C_value als Länge aus. Somit kommt getchar() ins Spiel und wartet auf das nächste '\n' oder EOF. Das kommt aber erst mit der nächsten Eingabe, die somit komplett ignoriert wird.

Grüße
rubberman