2015-01-15 1 views
1

Я пытаюсь прочитать файл с именем на каждой строке, как Джим Abby Тимоти и хранить каждое имя в месте в массиве, так что я могу позже работайте с каждым индивидуальным именем. Это код, который у меня есть, но я не думаю, что имена хранятся правильно, потому что, если я изменю порядок имен в файле, действия с этим именем тоже изменится. Действия зависят от имени, а не от места размещения.Добавление строк в файле в массив в C

FILE *ptr_file; // pointer to file 
char name[100]; 
size_t k=0; 
ssize_t read; 
char *line = NULL; 

while ((read= getline(&line, &k, ptr_file))!=-1) 
      { 
      fscanf(ptr_file, "%s", &name); 
      printf("%s ",name); 
      } 

`Я пытаюсь сделать что-то подобное с именами

  for (i =0; i <length-1; i++) 
      //for the length of the string add each letter's value up 
       { 
       num = num + name [i]; 
       } 

но когда я переключаю разместить название в списке, значение NUM также изменяется.

+0

Пожалуйста, предоставьте [MCVE] (http://stackoverflow.com/help/mcve) –

ответ

0

Возможно, что-то вроде этого. В этом коде я предполагаю, что в файле будет меньше 200 имен. Вы можете изменить это изменение размера «имен» массива

FILE *ptr_file; // pointer to file 
char names[200][100]; 
size_t k=100; 
size_t namesCount = 0; 
size_t read; 

while ((read= getline(names[namesCount], &k, ptr_file))!=-1) //reading name to names array 
{ 
    printf("%s ",names[namesCount++]);//printf just readed name 
} 
+2

Проверьте man-страницу 'getline()', вы не должны использовать его с буфером, выделенным в стеке. Также он не может быть литералом массива, он должен быть указателем (* имена будут изменены). – Fernando

0

GetLine() делает выделение памяти для вас, когда вы передаете NULL указатель. Я прокомментировал код для пояснения.

#include <stdio.h> 
#include <stdlib.h> 
#define THRESHOLD (5) 
int main(int argc,char** argv) { 
    // the file containing the names (one in each line) 
    char* fn = "test"; 
    // lets open the file (you should check the result!) 
    FILE* file = fopen(fn,"r"); 
    // allocate memory for the array 
    char** names = (char**)malloc(THRESHOLD * sizeof(char*)); 
    size_t i; 
    // set all the values to NULL 
    for(i=0; i<THRESHOLD; i++) { 
    names[i] = NULL; 
    } 
    // initialize the count 
    size_t count = 0; 
    // read all names until EOF and resize the array if needed 
    while(getline(&names[count],&i,file) != EOF) { 
    count++; 
    if(count >= THRESHOLD) { 
     names = (char**)realloc(names,(count+THRESHOLD)*sizeof(char*)); 
    } 
    } 
    // resize (shrink) the array to the actual size                                               
    names = (char**)realloc(names,count * sizeof(char*)); 
    // do something with the names (i just print them) 
    for(i=0; i<count; i++) { 
    printf("element %d, value %s",i,names[i]); 
    } 
    // you have to free the memory (allocated by getline) 
    for(i=0; i<count; i++) { 
    free(names[i]); 
    } 
    // you have to free memory (allocated by you) 
    free(names); 
    return 0; 
} 
0

Это трудно понять, что вы имеете в виду, но, похоже, есть два фундаментальных логических проблем вы (не обращая внимания на конкретные технические моменты подсвеченные в других ответов).

1) код считывает одну строку с помощью getline и отбрасывая результат в line, то сразу читает больше текста из файла, используя fscanf.

2) Каждое имя чтение из файла с помощью fscanfперезаписывает в name буфер, который является одной строкой до 99 символов плюс NULL терминатора.

Когда вы приступите к обработке буфера, он будет содержать только фамилию, прочитанную вызовом fscanf, или вздор, если в файле есть нуль или одна строка. Кроме того, параметр fscanf формата "%s" сообщает fscanf читать строку до первого символа пробела (включая символ табуляции или новой строки), который, вероятно, подходит для простых имен, но не для того, чтобы вы хотели, чтобы имена и имена были первыми и вторыми.

Это означает, что изменение порядка файла, вероятно, изменит имя, которое находится в буфере name в конце процедуры, которая читает файл. Вот почему значение num отличается.

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