2016-04-17 5 views
-2

Я пытаюсь открыть файл (Myfile.txt) и объединить каждую строку в один буфер, но получаю неожиданный вывод. Проблема в том, что мой буфер не обновляется последними конкатенированными строками. Любая вещь, отсутствующая в моем коде?String/char * concatinate, C

Myfile.txt (Файл, чтобы открыть и прочитать)

Good morning line-001: 
Good morning line-002: 
Good morning line-003: 
Good morning line-004: 
Good morning line-005: 
. 
. 
. 

Mycode.c

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

int main(int argc, const char * argv[]) 
{ 
    /* Define a temporary variable */ 
    char Mybuff[100]; // (i dont want to fix this size, any option?) 
    char *line = NULL; 
    size_t len=0; 
    FILE *fp; 
    fp =fopen("Myfile.txt","r"); 
    if(fp==NULL) 
    { 
     printf("the file couldn't exist\n"); 
     return; 
    } 
    while (getline(&line, &len, fp) != -1) 
    { 
     //Any function to concatinate the strings, here the "line" 
     strcat(Mybuff,line); 
    } 
    fclose(fp); 
    printf("Mybuff is: [%s]\n", Mybuff); 

    return 0; 
} 

Am ожидал мой выход будет:

Mybuff is: [Good morning line-001:Good morning line-002:Good morning line-003:Good morning line-004:Good morning line-005:] 

Но, я получаю ошибку сегментации (ошибка времени выполнения) и значение мусора. Кто-нибудь думает? Благодарю.

+1

вы испытываете переполнение буфера с жестким кодом 100. Используйте указатели, * hint: realloc * – t0mm13b

+0

@ t0mm13b: Спасибо за повтор, но все та же проблема! Добавлен Mybuff = realloc (Mybuff, sizeof mybuff), ... вы можете помочь мне в PLS, iam, новом для языка C. –

+0

Прочтите [это примечания к лекциям Корнелла] (http://www.cs.cornell.edu/courses/cs2022/2011sp/lectures/lect04.pdf)! Получите также книгу K & R. Начните оттуда. – t0mm13b

ответ

0

В качестве указателя укажите MyBuff и используйте распределение динамической памяти.

#include <stdlib.h> /* for dynamic memory allocation functions */ 

char *MyBuff = calloc(1,1); /* allocate one character, initialised to zero */ 
size_t length = 1; 

while (getline(&line, &len, fp) != -1) 
{ 
    size_t newlength = length + strlen(line) 
    char *temp = realloc(MyBuff, newlength); 
    if (temp == NULL) 
    { 
      /* Allocation failed. Have a tantrum or take recovery action */ 
    } 
    else 
    { 
      MyBuff = temp; 
      length = newlength; 
      strcat(MyBuff, temp); 
    } 
} 

/* Do whatever is needed with MyBuff */ 

free(MyBuff); 

/* Also, don't forget to release memory allocated by getline() */ 

выше оставит в новой строки MyBuff для каждой строки считывается getline(). Я оставлю их как упражнение.

Примечание: getline() является линукс, а не стандартная C. Функция как fgets() доступна в стандартном C для чтения строки из файла, хотя он не выделяет память, как getline() делает.

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