[英]Dynamically increase array size in C using realloc
我正在嘗試將文件的元素保存到結構數組中。
我想動態增加分配在數組中的 memory 以適合我文件中的總行數(結構)。
.txt 文件如下所示:
R&B;6jvvpPJQJy5rMOEkLlADl6;Trey Songz
R&B;6p8JTP4A9NZHtxRVhkEo6s;T-Pain
R&B;3SwhPTNNU5hpF33bbCsji6;BJ The Chicago Kid
R&B;5yvhdo8FXbBsIllxv2Rr94;SZA
R&B;5Yq38evNk28qlTVHHtwBhT;James Blake
R&B;5yamjs92dcayRVlNuY116G;H.E.R.
R&B;4FjcZsKyGhhZnuYq0nzXpZ;T-Pain
R&B;22jnEneSABg4vRCR1vow7F;Daniel Caesar
R&B;57qiTKh8bVX0VtfUNTQqhw;The Weeknd
這是目前我的代碼。 ( songFile
和genresList
與songsList
做同樣的事情,但目前還沒有實現)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct genresFile{
char* genre;
char* idSong;
char* artist;
} genresFile;
typedef struct songsFile{
char* idSong;
int popularity;
char* mode;
} songsFile;
int main(int argc, char *argv[])
{
FILE* songs = fopen("songs.txt", "r");
FILE* genres = fopen("genres.txt", "r");
genresFile* genresList = NULL;
//songsFile* songsList = NULL;
char *buf = malloc(256);
char *tmp;
int i = 0;
while (fgets(buf, 255, genres)){
genresList = realloc(genresList, (i+1)*sizeof(genresFile));
if ((strlen(buf)>0) && (buf[strlen (buf) - 1] == '\n'))
buf[strlen (buf) - 1] = '\0';
genresFile object;
tmp = strtok(buf, ";");
object.genre = tmp;
tmp = strtok(NULL, ";");
object.idSong = tmp;
tmp = strtok(NULL, ";");
object.artist = tmp;
genresList[i] = object;
i++;
}
printf("%s, %s, %s\n",genresList[3].genre, genresList[3].idSong, genresList[3].artist);
free(genresList);
//free(songsList);
fclose(songs);
fclose(genres);
return 0;
}
這是我從最后的印刷品中得到的 output:
Soul, qWZdkBl4UVPj9lK6HuuFM, r Thomas & The Volcanos
這是 .txt 文件的最后一行,藝術家的名字開頭缺少一個字母。
這將保存在數組的每個元素中。 請幫忙:D
分配指針並不意味着復制字符串。
緩沖區buf
在以下幾行中被覆蓋,因此指針指向的內容也發生了變化。
為避免這種情況,您應該復制字符串而不是僅僅分配指針。
可以這樣做:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct genresFile{
char* genre;
char* idSong;
char* artist;
} genresFile;
typedef struct songsFile{
char* idSong;
int popularity;
char* mode;
} songsFile;
char* copy_string(const char* str) {
char* copy = malloc(strlen(str) + 1); /* +1 for terminating null-character */
if (copy != NULL) strcpy(copy, str);
return copy;
}
int main(int argc, char *argv[])
{
FILE* songs = fopen("songs.txt", "r");
FILE* genres = fopen("genres.txt", "r");
genresFile* genresList = NULL;
//songsFile* songsList = NULL;
char *buf = malloc(256);
char *tmp;
int i = 0;
while (fgets(buf, 255, genres)){
genresList = realloc(genresList, (i+1)*sizeof(genresFile));
if ((strlen(buf)>0) && (buf[strlen (buf) - 1] == '\n'))
buf[strlen (buf) - 1] = '\0';
genresFile object;
tmp = strtok(buf, ";");
object.genre = copy_string(tmp);
tmp = strtok(NULL, ";");
object.idSong = copy_string(tmp);
tmp = strtok(NULL, ";");
object.artist = copy_string(tmp);
genresList[i] = object;
i++;
}
printf("%s, %s, %s\n",genresList[3].genre, genresList[3].idSong, genresList[3].artist);
free(genresList);
//free(songsList);
fclose(songs);
fclose(genres);
return 0;
}
如果您的(目標)環境支持它,您可以使用strdup()
而不是這個copy_string()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.