Zahlen aus Datei einlesen und auf ganzzahligkeit prüfen

mihrisahbaran

Grünschnabel
Hallo zusammen,
ich habe Problem mit c/c++, also ich muss ein Programm machen aber habe ich keine Ahnung, wie ich machen kann! :confused:

Also wir haben einige „file.txt“ (ein teil von eine text Datei schauen Sie bitte unten) in jedem txt Datei gibt es die Zahlen. Diese Zahlen, auf linke Seite fangen von 0x00000000 bis 0x00003fff. Das gilt für jede txt Datei so. aber auf rechte Seite(die Zahlen nach: kommen) für jede txt Datei bisschen unterschiedlich. Aber jede hat selber Regel (also sehen Sie bitte ?? und ? ) PageNumber ist für jede txt file unterschiedlich. Also kann sein z.B.: (PageNumber 0/1 oder 1/20 --1.page von 20 pages...20/20 usw.)

Also Mein Programm soll direkt erste PageNummer scannen und wissen, Wie viele pages wir haben. Und muss die zahlen prüfen, ob die in richtige Reihenfolge sind. Wenn z.B.: nach 0x00000004 --> 0x00000006 kommt, soll mein Programm error melden, dass es 0x00000005 nicht in Line gefunden hat. Bzw. für die reche Seite selbe weg gilt.
Ich freue mich wenn jemand Ahnung hat und mir hilft:)
Ich habe einigen code geschrieben aber die sind durcheinander
************
Rev-ID=0x0012 FW=0x0012 …………………
DMA Pages = 2 (0..1)
DMA Buffer Number 0 (save only selected Buffer)
PageNumber 0/1 ####################################################
0x00000000:0x1b013fff--??
0x00000001:0xefa5fff8--?
0x00000002:0x1c020000--??
0x00000003:0xefa50000--?
0x00000004:0x1c020001--??
0x00000005:0xefa50008--?
0x00000006:0x1c020002--??
0x00000007:0xefa50010--?
0x00000008:0x1c020003--??
0x00000009:0xefa50018--?
…………..

0x00003ff9:0xf0a5ffd8--?
0x00003ffa:0x00013ffc--??
0x00003ffb:0xf0a5ffe0--?
0x00003ffc:0x00013ffd--??
0x00003ffd:0xf0a5ffe8--?
0x00003ffe:0x00013ffe--??
0x00003fff:0xf0a5fff0--?
PageNumber 1/1 #####################################################
0x00000000:0x00021fff--??
0x00000001:0xf0a5fff8--?
0x00000002:0x00012000--??
0x00000003:0xf0a50000--?
0x00000004:0x00012001--??
………..

0x00003ffc:0x00013ffd--??
0x00003ffd:0xf0a5ffe8--?
0x00003ffe:0x00013ffe--??
0x00003fff:0xf0a5fff0--?

**************
#include <stdio.h>
#include <string.h>
#include <iostream> // für std::cout
#include <fstream> // für std::fstream
#include <string> // für std::string und std::getline
using namespace std;

/////////////////////////////////////
int main ()
{
char eingel [80];
FILE *eingab;
//long int eingel;
if((eingab = fopen("file.txt", "rt")) == NULL)
if(!eingab)
{
cout << "Could not open file \"file.txt\"!" << endl;
return 0;
}

char line [ 128 ]; //or other suitable maximum line size
while ( fgets ( line, sizeof line, eingab ) != NULL ) //read a line
{
cout << line << endl;
}
return 0;

// else {

///////////////////////////////////////


while (!feof(eingab)) {

fscanf(eingab, "%s", &eingel);
cout << eingel << endl;
int index;
if(strcmp("0x00000000" , eingel)) {
if(strspn("0x00000000" , " 0x ")){
for(index= 0x00000001; index <=0x00003fff; index++); //*1 for*

/* {
for(index2= 0x00000000; index2 <= 0x00003fff; index2++) *2 for*
{
if(eingel[index] == test[index2])
//{
/*Wenn der Wert von eingel mit Parameter index mit Wert von test
mit Parameter index2 übereinstimmt, soll die 2 for-Schleife verlassen
werden und in die erste gesprungen werden und das nächste Zeichen
von eigel mit allen test Werten überprüft werden, wenn das Ende von
noch nicht erreicht ist
}
}
}*/
}
}
printf("Nicht nur ganze Zahlen.\n");
printf("Programmende.");
getchar();
exit(0);

printf("Es gibt kein\"-\" im String\n");
printf("%s\n\n", eingel);
}



return 0;
}
 
Zuletzt bearbeitet:
Hallo auch (zu faul, deinen Namen zu schreiben ;-),

also ich setze mal konzeptionell da an, wo du wirklich in der Lage bist ,die Strings zeilenweise einzulesen und vorliegen hast.

Ich habe ähnllich Mechanismen schon mit MFC umgesetzt, allerdings erleichtern einem die CString und CStringArray Klassen die Arbeit ungemein :-)

Wenn ich das richtig sehe, ist die Bedingungen für eine korrekte Verarbeitung der Daten ist, dass die Durchnummerierung sowohl die Seitennummern als auch die Indexe für den Inhalt einer Seite fortlaufend ist!


Mein Ansatz wäre:

Halte dir die momentanen Werte als Variable:

also z.B.
Code:
    long currentPage = 0;
    long currentPageItem = 0;

Dann baust du dir eine Schleife, wo du über alle Zeilen der Textdatei iterierst.
Code:
    for( int i = 0; i < myLineCount; i++ ) {
        char myLine[20];    //myLine enthält deine Zeile, die es auszuwerten gilt

        // Überprüfe, ob die Zeile mit 'Page Number' beginnt
        if( strncmp(myLine, "Page Number", 11) == 0 ) {
                // Zeile fängt mit Page Number an, also Seitenzahl überprüfen
                int nextPage = getNextPageNumber(myLine);
                if( nextPage - 1 != currentPage) {
                        // Fehler Seitenzahl ist nicht gleich Seitenzahl -1
                }
                else {
                        currentPage++;
                }                
                continue;
        }

        // Diese Zeile (myLine) beim Semikolon trennen
        char leftValue[10];    // enthält den String der links vom Semikolon steht
        char rightValue[10];  // enthält den String der rechts vom Semikolon steht

        // Schreibe dir Funktionen, die dir die hexadezimale Strings in dezimale Zahlenwerte wandelt (z.B. HexStringToDezimalValue(char *str);

        long leftLongValue = HexStringToDezimalValue(leftValue);
        long rightLongValue = HexStringToDezimalValue(tightValue);

        // Überprüfe, od der Momentane Index wirklich der richtige ist
        if( leftLongValue - 1 != currentPageItem ) {
                // Fehler, der Index ist nicht genau 1 höher
        }
        else {
                currentPageItem++;
                // verarbeite deinen Wert rightLongValue
         }
    }

Ich hoffe, dieser Lösungsansatz, auch wenn er net ausprgrogrammiert ist, wird dich n bissl in deiner Aufgabe weiterbringen.

Ich wünsch dir viel Erfolg und ich hafte net für den Kram, den ich gerade geschrieben habe ;-)

Bis denne,

Peter


P.S. Verwende besser englische Variablennamen!
 
Zuletzt bearbeitet:
Hallo Peter ,
danke sehr für deine erste Hilfe :) . ich bin mit c/c++ Neuling.
die codes, die du geschrieben hast, sind gut. ich habe versucht mit deinem code etwas zu machen aber das geht nicht. wie kann ich die mit meinem codes benutzen! und zum ende meiner Aufgabe kommen. kannst du bitte mir bisschen weiterhelfen :D. und vielleicht kannst du die auch probieren.
bis dann
mihrisah
code
Code:
	#include <stdio.h>
	#include <string.h>
	#include <iostream> // für std::cout 
	#include <fstream> // für std::fstream 
	#include <string> // für std::string und std::getline 
	using namespace std;
	
///////////////////////////////////////////////////////////////////////////////////////
int main ()
{
  
  FILE *eingab;
  //long int eingel;
  if((eingab = fopen("file.txt", "rt")) == NULL)
  if(!eingab) 
  {
	  cout << "Could not open file \"file.txt\"!" << endl;
  return 0;
  }
int x=0;
long int li1, li2;
char * pEnd;
   
 char line [164]; //or other suitable maximum line size        
	while ( fgets ( line, sizeof line, eingab ) != NULL ) //read a line 
	{ 
		x++;
		li1 = strtol (line,&pEnd,0); //Zahlenwerte vor Semikolon in dezimale wandelt
		li2 = strtol (pEnd,&pEnd,'0'); // Nach Semikolon sieht es als 0 :-( [es muss xxxxxxxxx:0xefa50020--> Zahlenwerte nach Semikolon in dezimale wandeln] 

		cout << x <<"="<< li1 <<":"<< li2 <<"->" <<line ;
	}
 while (!feof(eingab)) {
////////////////////////////////////////////////////////////////////////////////////////	  
 long currentPage = 0;
 long currentPageItem = 0;
 int myLineCount=1000;
	for( int i = 0; i < myLineCount; i++ ) {
        char myLine[20];    //myLine enthält meine Zeile, die es auszuwerten gilt

        // Überprüfe, ob die Zeile mit 'PageNumber' beginnt
        if( strncmp(myLine, "PageNumber", 10) == 0 ) {
                // Zeile fängt mit Page Number an, also Seitenzahl überprüfen
               	int nextPage = getNextPageNumber(myLine);
                
				if( nextPage - 1 != currentPage) {
                  printf("Fehler"); // Fehler Seitenzahl ist nicht gleich Seitenzahl -1
                }
                else {
                        currentPage++;
                }                
                continue;
			}
	
         //Diese Zeile (myLine) beim Semikolon trennen
        char leftValue[10];    // enthält den String der links vom Semikolon steht
        char rightValue[10];  // enthält den String der rechts vom Semikolon steht

        //  Funktionen, die  die hexadezimale Strings in dezimale Zahlenwerte wandelt 
		//(z.B. HexStringToDezimalValue(char *str);

        long leftLongValue = HexStringToDezimalValue(leftValue);
        long rightLongValue = HexStringToDezimalValue(rightValue);

        // Überprüfe, ob der Momentane Index wirklich der richtige ist
        if( leftLongValue - 1 != currentPageItem ) {
              printf("Fehler, der Index ist nicht genau 1 höher");   // Fehler, der Index ist nicht genau 1 höher
        }
        else {
                currentPageItem++;
                // verarbeite meinen Wert rightLongValue
		
	
		}
	}
}	
	return 0; 
}
 
Zuletzt bearbeitet:
Zurück