2015-04-01 3 views
1

Я работаю над проектом, использующим C, и для проекта, который я должен читать в текстовом файле, и хранить каждое слово в массиве. Мне также нужно удалить знаки препинания, поэтому мне нужно использовать 2-мерный массив, чтобы редактировать слова. У меня возникли проблемы с выяснением того, как получить слова в 2-мерном массиве. Это то, что я сделал до сих пор:Сохранение строк из текстового файла в двумерный массив

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAX 1001 
#define LINES 81 

int main(void) { 
    int stringSize; 
    int i =0; 
    char *x[MAX][LINES]; 
    char str[MAX]; 
    char y[MAX]; 
    FILE *fp; 

    fp = fopen("TwoCitiesStory.txt","r"); 
    if(fp == NULL) { 
     printf("Cannot open file.\n"); 
     exit(1); 
    } 

    while(!feof(fp)) { 
     for(i=0;i<MAX;i++){ 
      fscanf(fp,"%s",x[i][LINES]); 
     } 
    } 

    return 0; 
} 
+0

Вы хотите прочитать строку из файла ... в% s будет читать только слова –

+0

Для примера, если текстовый файл «Привет, меня зовут Боб». Мне нужен массив для хранения x [0] [] = «Привет» x [1] [] = «мой» и т. Д. Максимальное количество слов в текстовом файле составляет 1000, а максимальная длина слова - 80 символов. –

+0

, с какими проблемами вы сталкиваетесь с этим кодом –

ответ

1
  1. Читать всю линию, используя fgets()
  2. магазина линии чтения в 2D массив

Весь код выглядит

char x[row][col]; 
char buf[300]; 
int i=0,j=0; 
memset(x,0,sizeof(x)); 
while(fgets(buf,sizeof(buf),fp)) 
{ 
    size_t n = strlen(buf); 
    if(n>0 && buf[n-1] == '\n') 
    buf[n-1] = '\0'; 
    if(i>= row && n> col) 
    break; 
    strcpy(x[i],buf); 
    i++; 

} 

Редакции:

Если вам нужно каждое слово отдельно в массиве. buf используется для чтения всей строки. strtok() используется, чтобы разбить линию на слова с пробелом в качестве разделителя. Затем сохраните каждое слово в каждой строке.

size_t n; 
while(fgets(buf,sizeof(buf),fp)) 
{ 
    char *p = strtok(buf," "); 
    while(p != NULL) 
    { 
     n = strlen(p); 
     if(i>= row && n> col) 
     break; 
     strcpy(x[i],p); 
     i++; 
     p = strtok(NULL," "); 
    } 
} 

Если вы хотите распечатать массив пойти

int i; 
for(i=0;i<row;i++) 
printf("%s\n",x[i]); 

Why feof() is wrong

+0

Это не отделяет каждое слово в массиве. \t Например, если текстовый файл содержит «Привет, мое имя - Боб». Мне нужен массив для хранения x [0] [] = «Привет» x [1] [] = «мой» и т. Д. Максимальное количество слов в текстовом файле составляет 1000, а максимальная длина слова - 80 символов. –

+0

@beginner_coder Проверьте изменения – Gopi

+0

Код, который он запускает успешно, но я немного смущен тем, как вы достигли этого ответа. Является ли строка максимальным числом слов и совставляет длину самих слов? Сначала вы создали char x [row] [col]; который создал массив символов, а затем вы создали buf [300] ;. Но что делает buf? Если мне нужно напечатать слова после, какой массив я вызываю? Я пробовал печатать следующим образом: for (i = 0; i <строка; i ++) для (i = 0; i

1

Следующая строка

char *x[MAX][LINES]; 

объявлен 2D массив указателей. Вам нужен всего лишь 2D массив символов.

char x[MAX][LINES]; 

Код для чтения слов может быть упрощена:

while(i < MAX && fscanf(fp, "%80s", x[i]) == 1) 
{ 
    ++i; 
} 
Смежные вопросы