C ++ lezen in een tekstbestand met getallen

Ik heb een txt-bestand met 16 regels gehele getallen. Elke regel bevat 5 gehele getallen, dit zijn de eerste 4 regels van het bestand,

0 0 0 0 0

     

1 2 3 4 5

     

5 4 3 2 1

     

5 100 1000 10000 10500

Ik moet één regel tegelijk lezen, alle 5 ints in een array opslaan en vervolgens de maximumwaarde vinden. Ik kan dit alleen prima. Waar ik problemen mee heb, is naar de volgende regel in het bestand gaan nadat ik de vorige regel heb gelezen.

  1. Lees de eerste regel van het tekstbestand

  2. nummers opslaan in een array

  3. array naar een functie sturen die het grootste gehele getal in de array retourneert

  4. plaats dat geretourneerde nummer in een nieuwe array die uiteindelijk de grootste getallen van alle 16 regels van het bestand bevat

  5. lees de volgende regel van het bestand

  6. schrijf de array met de 16 int array naar een bestand

Ik ondervind problemen met stap 5. Telkens wanneer ik mijn code uitvoer, wordt telkens regel 1 gelezen.

#include 
#include 
using namespace std;

int main()
{
    int n,i,j;
    int temp[5];
    //ask user
    cout<<"How many lines are in the file\n";
    cin>>n;
    int *array = new int[n];
    //open file
    ifstream inFile;
    inFile.open("input.txt");

    for(j=0;j<5;++i)
        {
            inFile >> temp[i];
            cout<<<" ";
        }
        cout<<"\n";
    }
    return 0;
}

Zoals je kunt zien, heb ik nog niet de functie find max value, ik wil repareren hoe ik het bestand aan het lezen ben voordat ik verder ga met het analyseren van de werkelijke gegevens.

En ja, dit is een huiswerkproject, over een paar dagen, maar mijn leraar heeft het lezen in bestanden niet eens uitgelegd en ons verteld de uitleg in het tekstboek te lezen (wat niet hielp voor wat we aan het doen waren). Ik kijk om te leren niet alleen het huiswerk te geven, dus een korte uitleg/voorbeeld van wat ik mis is prima.

0

3 antwoord

Ik zou de hele regel in één keer pakken met behulp van istream :: getline() en parseer dan de resulterende string. Bel dan opnieuw getline (), enz. Omdat je waarschijnlijk niet in het eindteken leest, hoewel waarom je het exacte gedrag krijgt dat je bent, is mij niet helemaal duidelijk.

1
toegevoegd
@Will Bekijk de docpagina waarnaar ik heb gelinkt. De argumenten zijn een verwijzing naar de char-array die de invoerreeks vasthoudt, een max aantal tekens om in te lezen en (optioneel) het scheidingsteken dat u wilt gebruiken.
toegevoegd de auteur Matt Phillips, de bron
@Will Meet strtok() . Hiermee kun je de C-reeks in de individuele nummers breken (gebruik dan atoi of iets om naar gehele getallen te converteren). De beschrijving is een beetje verwarrend, maar als u het voorbeeld als sjabloon gebruikt, zou u het moeten kunnen gebruiken.
toegevoegd de auteur Matt Phillips, de bron
@Will Dit is precies het antwoord dat ik je gaf, bel inFile.getline ()
toegevoegd de auteur Matt Phillips, de bron
zou regel 1 istream zijn :: getline (0)? of (1) of neemt die functie zelfs geen waarde aan?
toegevoegd de auteur Will Gunn, de bron
bedankt, maar ik ben pas echt bezig met C ++ (ik heb een goed begrip van C) en ik weet niet zeker hoe de char string getline je naar mijn nummers moet ontleden.
toegevoegd de auteur Will Gunn, de bron
Bedankt voor de hulp en ik kan zien hoe die methode schoner kan worden, maar ken je een manier om inFile van ifstream te vertellen om de volgende regel te lezen?
toegevoegd de auteur Will Gunn, de bron
Bedankt, ik zal dat dan proberen.
toegevoegd de auteur Will Gunn, de bron

Je code werkt goed voor mij. Ik geloof dat er een probleem is met het openen van een bestand, dus het blijft de temp [] -elementen uitvoeren zoals ze waren geïnitialiseerd. Probeer tijdens het lezen de status inFile te krijgen.

1
toegevoegd
dat is wat ik al aan het doen ben. In mijn laatste programma zal ik niet elk nummer als gelezen uitlezen, maar voor debugging doeleinden. Tenzij ik je verkeerd interpreteer, daarom heb ik inFile >> temp [i]; cout << temp [i] << "";
toegevoegd de auteur Will Gunn, de bron
Ik nam de initialisatie van temp weg en voegde het toe in een cout \ n zodat het de uitvoer voor elke regel op hun eigen regel in de terminal toont in plaats van alles bij elkaar. de uitvoer is gewijzigd, maar alle 16 regels laten dit zien, 0 0 1880267544 32654 1
toegevoegd de auteur Will Gunn, de bron
Ik voegde een cout-lus direct na de temp toe om te controleren, en ja, dat zijn de beginwaarden, dus ik denk dat mijn probleem is dat het niet correct in het bestand leest?
toegevoegd de auteur Will Gunn, de bron
Bedankt voor je hulp, ik heb het volledige pad ingevoerd en mijn originele code werkt :)
toegevoegd de auteur Will Gunn, de bron
Uw uitvoer is niet zo illustratief voor mij - de initiële temp [] -waarden zijn vergelijkbaar met de inhoud van de eerste regel. Probeer temp [] te initialiseren als {-1}, die eigenlijk meer zal laten zien :) UPD: als die wijziging niets verandert, geef me dan wat informatie over je platform en ontwikkelaardware die je gebruikt - dat gedrag kan interessant zijn .
toegevoegd de auteur Igor Shalyminov, de bron
Ik zou aan het begin nog één uitgang hebben toegevoegd om er zeker van te zijn dat dit niet de beginwaarden van temp [] zijn. En probeer fscanf ().
toegevoegd de auteur Igor Shalyminov, de bron
Precies. Probeer de volledige bestandsnaam op te geven of toegangsrechten in te stellen.
toegevoegd de auteur Igor Shalyminov, de bron

Ik denk niet dat je een array nodig hebt. Lees gewoon in regel voor regel, tokenize, static cast elk naar int (bekijk ascii-waarden binnen het getalsbereik 0-9 voor extra voorzichtig zijn, controleer op negatieven, etc.) en bewaar direct de max. Herhaal dit tot EOF en je hebt mogelijk de meest efficiënte oplossing.

Dus de stappen zouden zijn

1) Declareer een tijdelijke string.

2) Lees een regel in

3) Tokenize op de ruimte

4) Stel dat de eerste de max. Ga door met lezen en vergelijken. Wissel de waarden om als u een grotere vindt

5) Herhaal tot het einde

0
toegevoegd