Как я могу прочитать массив строк из файла? - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть файл с разными словами, разделенными символами новой строки.Как я могу прочитать и сохранить каждое слово в массиве строк?1 слово, 1 строка массива.Я публикую этот код, но я уверен, что он не работает, потому что я не могу понять, должен ли я использовать fgets или fscanf и как я могу написать каждое слово в каждой строке моего массива.

int file_string_temp_number_rows=200;
int file_string_temp_number_cols=200;
char **file_string_arr = (char**)malloc (file_string_temp_number_rows*sizeof(char));

for ( i = 0 ; i < file_string_temp_number_rows ; i++){
    file_string_arr[i] = (char*)malloc(file_string_temp_number_cols*sizeof(char));
}


if ((file_ptr= fopen(filename, "r"))){

    if((file_ptr=fopen(filename,"r"))==NULL)
    {
       printf("errore apertura file");
       return 1;  
    }
    else{
        while(!feof(file_ptr)){
            for(i = 0 ; i < file_string_temp_number_rows ; i++){
                    for(j = 0 ; j < file_string_temp_number ; j++){
                        fgets(file_string_arr , 40 , filename);
                        }
                    }
                }   
            }
        }
    }

1 Ответ

0 голосов
/ 05 декабря 2018

Обращаясь к вашему заглавному вопросу: Как мне прочитать массив строк из файла?

Есть много подходов для этого.Вот список основных шагов, которые можно использовать.

1) Используя fopen () , откройте файл и отсканируйте, чтобы определить следующее:
- Максимальная длина слова.
- Количество слов вфайл.

2) Создать контейнер: - Используйте calloc () , чтобы создать массив строк для слов.

3) Использование fopen() (снова), fgets () и strtok () (или вариант) для разбора содержимого файла в строковый массив.

Примечание , В приведенных ниже примерах фрагментов реализации используются определенные функции и методы, но не следует ограничивать реализацию только этими.Есть много путей, которые будут работать так же хорошо, так что не бойтесь экспериментировать.Например, для решения этой проблемы можно использовать fgets() или fscanf().Методы, выделенные ниже, являются лишь примерами одного из способов выполнения задачи.

Пример сканирования

// provides count of words, and longest word

int longestWord(char *file, int *nWords)
{
    FILE *fp=0;
    int cnt=0, longest=0, numWords=0;
    char c;
    fp = fopen(file, "r");
    if(fp)
    {

     // if((strlen(buf) > 0) && (buf[0] != '\t') && (buf[0] != '\n') && (buf[0] != '\0')&& (buf[0] > 0))

        while ( (c = fgetc(fp) ) != EOF )
        {
            if ( isalnum (c) ) cnt++;
            else if ( ( ispunct (c) ) || ( isspace(c) ) || (c == '\0' ))
            {
                (cnt > longest) ? (longest = cnt, cnt=0) : (cnt=0);
                numWords++;
            }
        }
        *nWords = numWords;
        fclose(fp);
    }
    else return -1;

    return longest;
}

//in main eg:
int longest;
int count;
...
longest = longestWord(".\\file.txt", &count);//longest and count will be 
                                             //used to create string arrays

Пример создания массива строк

//Create string arrays to contain words using result from original scan of file
char ** Create2DStr(ssize_t numStrings, ssize_t maxStrLen)
{
    int i;
    char **a = {0};
    a = calloc(numStrings, sizeof(char *));
    for(i=0;i<numStrings; i++)
    {
      a[i] = calloc(maxStrLen + 1, 1);
    }
    return a;
}
// in main(): Create array of words
char **words = Create2DStr(count, longest);//Using values obtained from scan section above
if(words) { //continue

Пример разбора на строки слов

// in main(), after performing scan and array creation:
const char delim[] = {" \n\t"};
char line[260];
char *buf = NULL;

fp = fopen(".\\file.txt", "r");
cnt=0;
while(fgets(line, 260, fp))//keep reading lines until EOF
{
    buf = strtok(line, delim);
    while(buf)//continue until last word in line is parsed
    {    
        if((strlen(buf) > 0) 
        {
            strcpy(words[cnt], buf);
            cnt++; //use as accurate count of words.
        }
        buf = strtok(NULL, DELIM);
    }
}
fclose(fp);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...