Zeilenanzahl einer Datei auslesen

Herakles

Profifragensteller
Moin!

Hat jemand eine Idee, wie man in der Konsole mit einem einzigen Befehl herausbekommt, wieviele Zeilen eine Datei beinhaltet?

Also, wenn ich sowas habe:

Code:
Hallo Welt!
Ich schreibe hier drei
Zeilen voll.

als Inhalt der Datei "kannweg.text", welcher Befehl gibt mir dann die Ziffer 3 zurück?

Danke, Herakles
 
wc -l <dateiname>

oder per Pipe:

cat <dateiname> | wc -l

Bei letzterer Lösung wird die Ausgabe des Dateinamens unterdrückt.
 
Ok, komme wohl doch nicht so einfach davon:

Folgender C++ - Code:
Code:
	int g;
	
	sprintf(temp,"wc -l /home/borgmann/modules | cut -c 1,2");
	system(temp);

<HIER FEHLT NATÜRLICH WAS!>

	cout<<g<<endl;
	exit(0);

Wie bekomm ich den Wert, der auf der konsole ausgegeben wird, in die int-Variable 'g'?

Sicher ne dumme Frage, aber ich weiss es echt nicht.

Herakles


[EDIT]: google gab mir gerade einen Hinweis auf eine Klasse namens "pipestream". Vielleicht hilft das als "hint" in die richtige Richtung. LEider kann ich den sourcecode dafür nicht finden, und ein einfaches ' #include <pipestream.h> ' funktioniert nicht...
 
Zuletzt bearbeitet:
ufff.....

oehm...

ich wuerde das vielleicht doch eher mit c-hausmitteln machen...
auch damit kannst du eine datei oeffnen, und die anzahl der linefeeds (char=0x0a) zaehlen.
 
Grundsätzlich so:
Code:
#include <stdio.h>

int main(int argc, char* argv[])
{
 if (argc == 1)
  {
   printf("Benutzung:  %s DATEI\n\n", argv[0]);
   printf("Gibt die Anzahl der Zeilen von DATEI aus.\n");
   return 1;
  }

 int counter = 0;
 int readbyte;

 FILE *file = fopen(argv[1], "r");
 if (file == NULL)
  {
   printf("Datei konnte nicht geöffnet werden!\n");
   return 1;
  }

 while ((readbyte = fgetc(file)) != EOF)
   if (readbyte == '\n')
     counter++;

 fclose(file);
 printf("'%s' hat %d Zeilen.\n", argv[1], counter);

 return 0;
}
Dieser Code soll nur das Prinzip verdeutlichen! Er liefert ein falsches Ergebnis, wenn die letzte Zeile nicht durch ein Newline abgeschlossen ist. Das überlasse ich dem OP als Denksportaufgabe. (Hint: Man muß nicht nur das letzte, sondern auch das vorletzte aus der Datei gelesene Byte vorhalten.)
 
Noch ein wenig kompakter.... ;)

Code:
#include <stdio.h>

int main(int argc, char* argv[])
{
	int count = 0;
	char szLine[256];
	FILE* fd = NULL;

	if(argc >= 2)
	{
		fd = fopen(argv[1], "r");
		if(fd != NULL)
		{
			while(fgets(szLine, sizeof(szLine), fd) != NULL)
			{
				count++;
			}
			printf("%s has %d lines\n", argv[1], count);
			fclose(fd);

		}
		else
		{
			printf("Can't open file: %s\n", argv[1]);	
		}
	}
	else
	{
		printf("Need an argument!");
	}
	return 0;
}

Funktioniert allerdings nur wenn die Zeilen durch Newline abgeschlossen sind.
 
Deine Variante mit fgets(3) funktioniert auch dann, wenn die letzte Zeile nicht mit einem Newline abgeschlossen ist. Aber: Wenn eine Zeile länger ist als sizeof(szLine), dann wird diese mehrfach gezählt. Hier muß man abwägen: Bei deiner Variante bekommt man das Problem mit dem fehlenden Newline am Dateiende frei Haus gelöst, meine Variante funktioniert mit beliebig langen Zeilen. Wenn man sizeof(szLine) groß genug wählt, kann man aber durchaus eine für die meisten Dateien zufriedenstellende Lösung erhalten.
 
Moin,

oder man "borgt" sich aus /usr/src/usr.bin/wc/wc.c den entsprechenden Part. :)

Cu, Elwood

PS: und entsprechende Lizenzen beachten.
PPS: War das nicht einer der Gründe, warum ich *BSD liebe?! :)
 
@ 0815Chaot
Da kann ich dir nur zustimmen..... :)
Deine Variante ist, wenn man auf Nummer sicher gehen will vorzuziehen.

Habe diese einwenig erweitert, um auch eine Zeile zu zählen die nicht mit einem Newline abgeschlossen ist.

Code:
int main(int argc, char* argv[])
{
	int count = 0;
	char cCurr = EOF;
	char cLast = EOF;
	FILE* fd = NULL;

	if(argc >= 2)
	{
		fd = fopen(argv[1], "r");
		if(fd != NULL)
		{
			do
			{
				cLast = cCurr;
				cCurr = fgetc(fd);
				if(cCurr == '\n')
				{
					count++;
				}
			}
			while(cCurr != EOF);

			/* falls vorletztes Zeichen noch nicht gelesen wurde
			   und die Datei nicht leer ist --> erhoehe Counter
			*/
			if(cLast != '\n' && cLast != EOF)
			{
				count++;
			}
			printf("%d\n", count);
			fclose(fd);

		}
		else
		{
			printf("Can't open file: %s\n", argv[1]);	
		}
	}
	else
	{
		printf("Need an argument!");
	}
	return 0;
}

Ich hoffe Herakles ist damit geholfen.
 
Zurück
Oben