تحليل الحواجز من ملف txt إلى صفيف متعدد الأبعاد في C.

1

هذا يقودني للجنون. أحاول تحليل كل جملة من ملف txt (أي جميع الأحرف بين النقاط) وإدراج كل جملة في صفيف. الهدف النهائي هو أن يكون لديك مصفوفة متعددة الأبعاد مع كل جملة كمصفوفة واحدة. تمكنت من الوصول إلى نقطة أعتقد أنها يجب أن تعمل فيها ولكني أتلقى خطأ خطأ تجزئة (تفريغ الأساسية) من الخط numOfRow++

void parseRows(FILE* file){
    int c;
    int numOfRow = 0;
    int numOfChar = 0;
    int numOfRows = countNumOfRows(file);
    fseek(file, 0, SEEK_SET); // Reset file pointer position to the beginning
    char **rows = malloc(numOfRows*sizeof(char*));
    for (int i=0; i < numOfRows; i++) rows[i] = malloc(1000*sizeof(char));

    while ((c=fgetc(file))!= EOF) {   
        if (c != '.') {
            rows[numOfRow][numOfChar] = c;
            numOfChar++;
        } else {
            rows[numOfRow][numOfChar] = '\0';
            numOfRow++;       // This is throwing the error              
            numOfChar = 0;            
        }
    }
    printOutput(rows, numOfRows);
}

إذا علقت على هذا السطر ، فإن البرنامج يستبدل كل سطر في المصفوفة الأولى ولا أحصل إلا على الجملة الأخيرة نتيجة لذلك فأنا أعلم أنه يعمل. ماذا ينقصني؟

أكمل الرمز هنا:

#include <stdio.h>
#include <stdlib.h>
#define USAGE "USAGE: ./huffman <textFile.txt>\n"

FILE* openFile(char[]);
void parseRows(FILE*);
int countNumOfRows(FILE*);
void printOutput(char**, int);

int main(int argc, char** argv){
    FILE* fd;
    if (argc != 2) printf("%s", USAGE);

    fd = openFile(argv[1]);
    parseRows(fd);
}

FILE* openFile(char* file){
    FILE* stream;
    stream = fopen(file, "r");
    return stream;
}

int countNumOfRows(FILE* file){
    int i = 0;
    char c;
    while ((c=fgetc(file))!= EOF) {   
        if (c == '.') i++;
    }
    printf("numero di righe %d\n", i);
    return i;
}

void parseRows(FILE* file){
    int c;
    int numOfRow = 0;
    int numOfChar = 0;
    int numOfRows = countNumOfRows(file);
    fseek(file, 0, SEEK_SET); // Reset file pointer position to the beginning
    char **rows = malloc(numOfRows*sizeof(char*));
    for (int i=0; i < numOfRows; i++) rows[i] = malloc(1000*sizeof(char));

    while ((c=fgetc(file))!= EOF) {   
        if (c != '.') {
            rows[numOfRow][numOfChar] = (char)c;
            numOfChar++;
        } else {
            rows[numOfRow][numOfChar] = '\0';    
            numOfRow += 1;               
            numOfChar = 0;            
        }
    }
    printOutput(rows, numOfRows);
}

void printOutput(char** matrix, int rows){
    for (int i=0; i<rows; i++){
        printf("%s", matrix[i]);
    }
}

مثال على ملف الإدخال textFile.txt:

Any text that contains more than one sentence.
This Should get parsed and return a 2 dimension array with every sentence as single array.

1 إجابة

0

تحسب الدالة countNumOfRows () النقاط الموجودة في الملف ، وتستخدم هذا الرقم لمساحة malloc لصفيفك. ومع ذلك ، من المحتمل أن يكون هناك المزيد من الأحرف خارج النقطة الأخيرة وقبل EOF (على سبيل المثال ، CR أو LF أو CRLF) ، بحيث يمكنك الكتابة بسهولة بعد نهاية ذاكرة malloc'd.

محاولة:

return (i + 1)

في نهاية countNumOfRows () ومعرفة ما إذا كان ذلك يقضي على segfault.

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام