C - fscanf进入动态阵列崩溃

时间:2017-05-29 10:56:06

标签: c arrays struct

我一直在修补这个C语音播放器的程序,但是从文件中读取时我遇到了一个问题。

typedef struct my_string
{
    char str[256]; // my string contains an array of 255 characters + null
} my_string;

typedef enum music_genre { pop, rock, jazz, classical} music_genre;

typedef struct track_data 
{
    my_string name;
    my_string path;
} track_data;

typedef struct track_array 
{
    int size;
    track_data* trackdata;
} track_array;

typedef struct album_data 
{
    int album_number;
    my_string name;
    my_string artist;
    music_genre genre;
    track_array tracks;
} album_data;

typedef struct albums_data 
{
    int size;
    album_data* data;
} albums_data;

void read_albums_from_file(albums_data* albums)
{
FILE* file_ptr;
int num_of_albums;
int i;
int j;
my_string string;

if ((file_ptr = fopen("albumfile.dat", "r")) == NULL)
{
    printf("File could not be opened.\n");
}
else
{
    printf("Success!\n");
    fscanf(file_ptr, "%d\n", &num_of_albums);
    printf("%d\n", num_of_albums);
    albums->size = num_of_albums;
    albums->data = malloc(sizeof(track_data) * albums->size);
    printf("um\n");
    for (i = 0; i < num_of_albums; i++)
    {
        printf("%d\n", albums->size);
        albums->data[i].album_number = i + 1;
        printf("um1\n");
        fscanf(file_ptr, "%255[^\n]%*c", &albums->data[i].name);
        printf("um2\n");
        fscanf(file_ptr, "%255[^\n]%*c", &albums->data[i].artist);
        printf("um3\n");
        fscanf(file_ptr, "%d\n", &albums->data[i].genre);
        printf("um4\n");
        fscanf(file_ptr, "%d\n", &albums->data[i].tracks.size);
        printf("um5\n");
        albums->data[i].tracks.trackdata = malloc(sizeof(track_data) * albums->data[i].tracks.size);
        printf("um6\n");

        for (j = 0; j < albums->data[i].tracks.size; j++)
        {
            fscanf(file_ptr, "%255[^\n]%*c", &albums->data[i].tracks.trackdata[j].name);
            printf("1");
            fscanf(file_ptr, "%255[^\n]%*c", &albums->data[i].tracks.trackdata[j].path);
        }

    }

}

}

以下部分专门崩溃了我的代码:

        for (j = 0; j < albums->data[i].tracks.size; j++) //assigns track data to album
        {
            fscanf(file_ptr, "%s", albums->data[i].tracks.trackdata[j].name);
            printf("1");
            fscanf(file_ptr, "%255[^\n]%*c", &albums->data[i].tracks.trackdata[j].path);
        }
    }
}

一旦尝试从文件中读取曲目,它就会崩溃。我尝试使用带有和不带&符号的人,我使用了一个名为&#39; string&#39;并且没有问题地阅读,但在这里它无法工作。我想我把它缩小到&#34;专辑 - &gt; data [i] .tracks.trackdata [j] .name&#34;导致问题。所有printf语句都是我尝试进行故障排除的。

这是它正在阅读的文件的内容(评论不在此文件中,我将它们添加进去解释)

1
Hands All Over
Maroon 5
0 // Genre
1 // # of tracks
Never Gonna Leave This Bed // Title
Desktop // Location

我使用指针并不是最强的;试图克服我的恐惧&#39;通过使用它们。

编辑:看来,当我通过GDB运行时,它并没有崩溃。

1 个答案:

答案 0 :(得分:0)

我解决了自己的问题;原来问题是分段错误。如果我替换了轨道位置中的循环读数:

 Dim input As Object

        Do
            Try
                input = Console.ReadLine()
            Catch
                Console.WriteLine("Error - Input was Invalid")
                input = Console.ReadLine()
            End Try
        Loop Until TypeOf input Is String

改为使用此代码:

for (j = 0; j < albums->data[i].tracks.size; j++)
    {
        fscanf(file_ptr, "%255[^\n]%*c", &albums->data[i].tracks.trackdata[j].name);
        printf("1");
        fscanf(file_ptr, "%255[^\n]%*c", &albums->data[i].tracks.trackdata[j].path);
    }

内存分配不正确;感谢所有的帮助!