Tekenreeks lezen per char tot einde regel C/C++

Hoe lees je een tekenreeks teken voor teken en stop je wanneer je het einde van de regel bereikt? Ik gebruik de fgetc-functie om uit een bestand te lezen en tekens in array te plaatsen (de laatste zal array veranderen in malloc), maar ik kan er niet achter komen hoe te stoppen wanneer het einde van de regel is bereikt

Dit geprobeerd (c is de variabele met char uit bestand):

if(c=="\0")

Maar het geeft een fout dat ik de aanwijzer niet kan vergelijken met een geheel getal

Bestand ziet eruit als (de lengte van de woorden is onbekend):

one
two
three

Dus hier komen de vragen:
1) Kan ik c vergelijken met \0 aangezien \0 twee symbolen is (\ en 0) of wordt het als één geteld (dezelfde vraag met \n)
2) Misschien moet ik \n gebruiken?
3) Als bovenstaande suggesties verkeerd zijn, wat zou je dan voorstellen (let op: ik moet string één teken per keer lezen)

(Let op: ik ben vrij nieuw in C++ (en programmeer het zelf))


Antwoord 1, autoriteit 100%

U wilt enkele aanhalingstekens gebruiken:

if(c=='\0')

Dubbele aanhalingstekens (“) zijn voor tekenreeksen, dit zijn reeksen tekens. Enkele aanhalingstekens (‘) zijn voor afzonderlijke tekens.

Het einde van de regel wordt echter weergegeven door het teken voor de nieuwe regel, namelijk ‘\n’.

Houd er rekening mee dat in beide gevallen de backslash geen deel uitmaakt van het teken, maar slechts een manier is om speciale tekens weer te geven. Met backslashes kunt u verschillende niet-afdrukbare tekens weergeven en ook tekens die anders de compiler in verwarring zouden brengen.


Antwoord 2, autoriteit 18%

Het antwoord op je oorspronkelijke vraag

Hoe lees je een tekenreeks teken voor teken en stop je wanneer je het einde van de regel bereikt?

is, in C++, heel eenvoudig, namelijk: gebruik getline . De link toont een eenvoudig voorbeeld:

#include <iostream>
#include <string>
int main () {
  std::string name;
  std::cout << "Please, enter your full name: ";
  std::getline (std::cin,name);
  std::cout << "Hello, " << name << "!\n";
  return 0;
}

Wilt u dit echt in c doen? Ik zou het niet doen! Het ding is, in C, je moet het geheugen toewijzen waarin je de personages hebt geplaatst die je hebt ingeleverd? Hoeveel karakters? Je weet niet van tevoren. Als u te weinig karakters toewijst, moet u elke keer een nieuwe buffer toewijzen om u te beseffen dat u meer personages leest dan dat u ruimte hebt gemaakt. Als u overmatig toewijst, verspilt u ruimte.

C is een taal voor programmering op laag niveau. Als u nieuw bent op het programmeren en schrijven van eenvoudige toepassingen voor het lezen van bestanden LINE-BY-LINE, gebruik gewoon C++. Het doet al die geheugen toewijzing voor u.

Uw latere vragen met betrekking tot "\0"EN END-OF-LIJNEN IN HET ALGEMEEN WERDEN BEANTWOORD DOOR ANDEREN EN DOEN DOEN TOEPASSING OP C Evenals C++. Maar als u C gebruikt, onthoud dan dat het niet alleen het einde van de lijn is dat ertoe doet, maar ook geheugentoewijzing. En u zult voorzichtig moeten zijn om uw buffer niet te overschrijden.


Antwoord 3, Autoriteit 14%

Als u C-functie gebruikt fgetcDan moet u een volgend karakter controleren of het gelijk is aan het nieuwe lijnkarakter of naar EOF. Bijvoorbeeld

unsigned int count = 0;
while ( 1 )
{
   int c = fgetc( FileStream );
   if ( c == EOF || c == '\n' )
   {
      printF( "The length of the line is %u\n", count );
      count = 0;
      if ( c == EOF ) break;
   }
   else
   {
      ++count;
   }
}    

of misschien is het beter om de code te herschrijven met een do-while-lus. Bijvoorbeeld

unsigned int count = 0;
do
{
   int c = fgetc( FileStream );
   if ( c == EOF || c == '\n' )
   {
      printF( "The length of the line is %u\n", count );
      count = 0;
   }
   else
   {
      ++count;
   }
} while ( c != EOF );

Natuurlijk moet je je eigen verwerking van gelezen xgaracters invoegen. Het is slechts een voorbeeld van hoe je de functie fgetczou kunnen gebruiken om regels van een bestand te lezen.

Maar als het programma in C++ is geschreven, zou het veel beter zijn als je de klassen std::ifstreamen std::stringen de functie std::getlineom een hele regel te lezen.


Antwoord 4, autoriteit 5%

Een tekstbestand heeft geen \0 aan het einde van regels. Het heeft \n. \n is een teken, geen tekenreeks, dus het moet tussen enkele aanhalingstekens staan

if (c == ‘\n’)

Other episodes