Создать динамический массив в отдельной функции и манипулировать им из вызывающей функции

Я работаю функцию, которая открывает файл,
функция, которая читает содержимое этого файла в динамический массив,
функция, которая закрывает файл.

Пока я могу выполнить все вышеперечисленное, за исключением того, что динамический массив выходит из области видимости, когда я возвращаюсь в вызывающее местоположение (основное). Я хочу хранить дополнительные данные в массиве в то время как в основной или даже отдельной функции. Как только я закончу добавлять данные в динамический массив, я запишу их содержимое в исходный файл, перезаписав его новыми данными, а затем закрою этот файл. Цель состоит в том, чтобы добавить данные в начало исходного файла. Что я делаю не так с функцией char *LoadFileData(FILE *fp, char* charPtr); что я не могу получить доступ или изменить его обратно в main?

Спасибо за помощь в этом.

    FILE *fSource;       // create source file pointer instance
char mode[] = "a+";  // default file open mode
char inStr[80];      // string to get input from user
char *tempFileData;  // dynamic string to hold the existing text file

// Open the source file
strcpy(mode, "r");   // change the file opnen mode to read
FileOpen(&fSource, mode);

// Load the source file into a dynamic array
LoadFileData(fSource, tempFileData);  // this is where I fail that I can tell.

printf("%s", tempFileData); // print the contents of the (array) source file //(for testing right now)
FileClose(&fSource);  // close the source file

J

char *LoadFileData(FILE *fp, char* charPtr)
{
int i = 0;
char ch = '\0';
charPtr = new char; // create dynamic array to hold the file contents
if(charPtr == NULL)
{
printf("Memory can't be allocated\n");
exit(0);
}
// loop to read the file contents into the array
while(ch != EOF)
{
ch = fgetc(fp);  // read source file one char at a time
charPtr[i++] = ch;
}
printf("%s", charPtr); // so far so good.
return charPtr;
}

0

Решение

Вместо прохождения в char * значение которого вы никогда не используете, присвойте возвращаемое значение функции tempFileData,

Так что измените функцию так:

char *LoadFileData(FILE *fp)
{
char* charPtr;
...

Тогда назовите это так:

tempFileData = LoadFileData(fSource);
3

Другие решения

Одной из проблем является сочетание следующих строк:

charPtr = new char; // create dynamic array to hold the file contents

charPtr[i++] = ch;

Вы выделяете память только для одного char но продолжаю использовать его так, как будто он может содержать много символов.

Вам нужно:

  1. Найдите количество символов, присутствующих в файле.
  2. Выделите память для всех символов (+1, если вам нужно завершить массив нулем).
  3. Считайте содержимое файла в выделенную память.
3

Как насчет возвращения string?

string LoadFileData(FILE *fp, char* charPtr)
2

Судя по отзывам каждого, эта модификация сработала. Спасибо!

char* LoadFileData(FILE *fp)
{
off_t size; // Type off_t represents file offset value.
int i = 0;
char ch = '\0';
char *charPtr; // dynamic arrary pointer that will hold the file contents

fseek(fp, 0L, SEEK_END); // seek to the end of the file
size = ftell(fp);        // read the file size.
rewind(fp);              // set the file pointer back to the beginning

// create a dynamic array to the size of the file
charPtr = new char[size + 1];

if (charPtr == NULL) {
printf("Memory can't be allocated\n");
// exit(0);
}

while (ch != EOF) {
ch = fgetc(fp); // read source file one char at a time
if (ch < 0) { // do not copy it if it is an invalid char
}
else {
charPtr[i++] = ch;
// load the char into the next ellement of the array
// i++;
}// end else
} // end while

return charPtr;
}
0
По вопросам рекламы [email protected]