2015-11-27 2 views
1

Привет, мне было интересно, может ли кто-нибудь помочь мне, это мой первый вопрос, задающий вопрос здесь, поэтому я сожалею, если не включил достаточную информацию. У меня есть задание, где у нас есть файл с более чем 50000 словами 1 в строке. Я пытаюсь скопировать его в двойной массив, а позже я мог бы называть буквы для слова, например, слово «рыба» быть на М [1] [] = "рыба" -> M [1] [2] = якопирование содержимого файла в двойной массив

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, const char * argv[]) { 
FILE *file; 
file= fopen("/desktop/textfile.txt", "rwx"); 
int words=0; 
    while ((ch = fgetc(file)) != EOF) {//using this to find number of words 
    if (ch == '\n'){ 
     words++; 
    } 
} 
char **M = (char **)malloc(sizeof(char *)*words); 
for(int i=0; i < words; i++) 
    M[i] = (char *)malloc(sizeof(char)*50); 

здесь лежит моя проблема, которую я пытаюсь скопировать содержимое текстового файла на М [] [], но это ничего

int a=0; 
while ((fgets(line,50, file)) != EOF){ 
    for(int i=0;i<strlen(line)-1;i++) 
    text[a][i] = line[i]; 
    a++;} 

Я попробовал другие вещи, как strcopy и я попытался исследовать, но я не понял ошибки у меня были с этими методами, не копировать, кто-то пожалуйста, помогите мне.

+1

'fgetc()' нуждается в 'rewind()', чтобы вернуться к чтению файла с начала снова – Gopi

+0

Согласитесь с вышеуказанным комментарием 'rewind'. В дополнение к исправлению этого, вы можете изменить свои 'fgets', чтобы скопировать прямо в массив' M', а не в первый промежуточный массив 'line'. Просто обязательно удалите '\ n', что' fgets' помещает в конец данных. Но если вы хотите скопировать его байтом по байту, как это делается в настоящий момент, вам нужно исправить тот факт, что копия не завершает целевой буфер с '\ 0', который необходим для строк. – kaylum

ответ

0

Ваш код в порядке на стороне алгоритма, синтаксис с другой стороны.

Так вот ваш главный немного заказана

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

using namespace std; 

int main(int argc, const char * argv[]) { 

int words = 50000; // you need to define words and initialize it correctly 

// We initialize M before processing the file 
char **M = (char **) malloc(sizeof(char *) * words); 
for(int i=0; i < words; i++) 
    M[i] = (char *) malloc(sizeof(char) * 50); 

FILE *file; 
file= fopen("./desktop/textfile.txt", "r"); // You're only reading so just r 
    int a=0; 
    while ((fgets(line,50, file)) != NULL && a < words) { // a<words means we don't want to overflow the buffer M 
     for(int i=0;i<strlen(line)+1;i++) // strlen returns the length of the string WITHOUT 
      M[a][i] = line[i];   // the terminating character (that you want), so +1 
            // I also replaced text by M since it's the actual array 
     } 
     a++; // a++ inside the while not the for, you want to go forth only on a new word. 
    } 

    /* From here on you can use M the way you want */ 
} 

Отсюда это должно работать, не стесняйтесь, если у вас все еще есть проблемы, но обратить внимание на порядок декларирования вами переменных. В идеале вы также проверили бы, правильно ли открыт файл, но вы можете сосредоточиться на нем позже.

EDIT: вам также необходимо проверить fgets s для NULL, а не EOF, см.: http://www.cplusplus.com/reference/cstdio/fgets/ по возвратной стоимости.

Смежные вопросы