Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Sätze in Datei zählen?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.12.2007, 18:05 Uhr
tester34



Hallo,

wie kann ich in einer Datei die Zeilen zählen? Das mit den Wörtern, zeichen und sätzen hat schon hin.
Danke für die Hilfe!

Mein Vorschlag:

C++:

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;

int analysiereDatei(char* , int& , int& , int& );
int file_exists(char*);

int main(int argc, char* argv[])
{
int wort=0, satz=0, zeile=0;
cout<<"|------------------------------------------------------------------------------|";
cout<<"|---------------------------DATEIINHALT ANALYSIEREN----------------------------|";
cout<<"|------------------------------------------------------------------------------|";
if(argc<2)
{
   cout<<"\n\nZu wenig Argumente angegeben!\n\n";
   system("PAUSE");
   return 0;
}
else
{
   file_exists(argv[1]);
   cout<<"\n\nSie haben die Datei \""<<argv[1]<<"\" untersucht.\n";
   cout<<"\nDiese enthaelt "<<analysiereDatei(argv[1], wort, satz, zeile)<<" Zeichen.\n";
   cout<<"Ausserdem finden sich in der Datei "<<wort<<" Woerter, "<<satz<<" Saetze und "<<zeile<<" Zeilen.\n\n\n\n";
}
system("PAUSE");
return 0;
}

int analysiereDatei(char* dateiname, int& wort, int& satz, int& zeile)
{
ifstream einlesestrom; //Datei-Einlesestrom mit dem Namen "einlesestrom definieren"
einlesestrom.open(dateiname, ios::in);    //zeigt auf ersten eingegebenen Teil nach dem Programmnamen
char c;
char feld[1000];
int zeichen=0;
while(einlesestrom.get(c))
{
    zeichen++;            //Zeichenzähler
    if(c==0x20)            //Wenn c ein Leerzeichen ist
    {
       wort++;
    }
    else if(c=='.'||c=='!'||c=='?')    //bei Vergleich immer HOCHKOMMAS!!!
    {
       satz++;
    }
}
einlesestrom.close();
einlesestrom.open(dateiname, ios::in);
while(einlesestrom.getline(feld,1000))
{
    satz++;
}
einlesestrom.close();
return zeichen;
}


int file_exists(char* dateiname)
{
   try
   {
   ifstream fileopen;    //Dateistrom mit Namen fileopen
   fileopen.open(dateiname, ios::in);
   if(!fileopen)    //fileopen liefert true zurück wenn alles i.O., wenn nicht true, dann...
   {
      fileopen.close();    //Datei schließen
      throw -1;
   }
   }
   catch(int f)
   {
       cout<<"\n\nFehler beim oeffnen der Datei bzw. Datei wurde nicht gefunden!\n\n";
       return 0;
   }
}



MfG Tobi

Dieser Post wurde am 08.12.2007 um 18:06 Uhr von tester34 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.12.2007, 18:15 Uhr
0xdeadbeef
Gott
(Operator)



C++:
#include <fstream>
#include <iostream>
#include <string>

int main() {
  std::ifstream in("datei.txt");
  unsigned x = 0;
  std::string zeile;

  while(std::getline(in, zeile)) ++x;

  std::cout << "datei.txt hat " << x << " Zeilen." << std::endl;
}


...oder auch

C++:
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>

int main() {
  std::ifstream in("datei.txt");

  in.unsetf(std::ios::skipws);

  std::cout << std::count(std::istream_iterator<char>(in),
                          std::istream_iterator<char>(), '\n') << std::endl;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 08.12.2007 um 18:20 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.12.2007, 20:43 Uhr
tester34



@0xdeadbeef
So nun habe ich deinen ersten Vorschlag umgesetzt.
Ich erhalte als Zeilenzahl aber immer noch 0!
Muss man einen Zeilenwechsel irgendwie besonders kennzeichnen in einer txt datei? Unter "Format" ist Zeilenumbruch aktiv!
MfG


C++:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>
#include <stdio.h>

using namespace std;

int analysiereDatei(char* , int& , int& , int& );
int file_exists(char*);

int main(int argc, char* argv[])
{
int wort=0, satz=0, zeile=0;
cout<<"|------------------------------------------------------------------------------|";
cout<<"|---------------------------DATEIINHALT ANALYSIEREN----------------------------|";
cout<<"|------------------------------------------------------------------------------|";
if(argc<2)
{
   cout<<"\n\nZu wenig Argumente angegeben!\n\n";
   system("PAUSE");
   return 0;
}
else
{
   file_exists(argv[1]);
   cout<<"\n\nSie haben die Datei \""<<argv[1]<<"\" untersucht.\n";
   cout<<"\nDiese enthaelt "<<analysiereDatei(argv[1], wort, satz, zeile)<<" Zeichen.\n";
   cout<<"Ausserdem finden sich in der Datei "<<wort<<" Woerter, "<<satz<<" Saetze und "<<zeile<<" Zeilen.\n\n\n\n";
}
system("PAUSE");
return 0;
}

int analysiereDatei(char* dateiname, int& wort, int& satz, int& zeile)
{
ifstream einlesestrom; //Datei-Einlesestrom mit dem Namen "einlesestrom definieren"
einlesestrom.open(dateiname, ios::in);    //zeigt auf ersten eingegebenen Teil nach dem Programmnamen
char c;
int zeichen=0;
string tmp;    //#include <string> einbinden
while(einlesestrom.get(c))
{
    zeichen++;            //Zeichenzähler
    if(c==0x20)            //Wenn c ein Leerzeichen ist
    {
       wort++;
    }
    else if(c=='.'||c=='!'||c=='?')    //bei Vergleich immer HOCHKOMMAS!!!
    {
       satz++;
    }
}
while(getline(einlesestrom, tmp))
{
    zeile++;
}
einlesestrom.close();
return zeichen;
}


int file_exists(char* dateiname)
{
   try
   {
   ifstream fileopen;    //Dateistrom mit Namen fileopen
   fileopen.open(dateiname, ios::in);
   if(!fileopen)    //fileopen liefert true zurück wenn alles i.O., wenn nicht true, dann...
   {
      fileopen.close();    //Datei schließen
      throw -1;
   }
   }
   catch(int f)
   {
       cout<<"\n\nFehler beim oeffnen der Datei bzw. Datei wurde nicht gefunden!\n\n";
       return 0;
   }
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.12.2007, 20:46 Uhr
0xdeadbeef
Gott
(Operator)


Du bist ja dann auch am Ende der datei. Geh zum Anfang zurück, oder zähl einfach die '\n' während der get()-Schleife.

Ürbigens ist der Wortzählungsalgorithmus fehlerbehaftet; was, wenn zwischen zwei Worten mal mehr als ein Leerzeichen ist (z.B. Blocksatz), oder ein tab, oder eine neue Zeile?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: