我一直在修补这个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运行时,它并没有崩溃。答案 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);
}
内存分配不正确;感谢所有的帮助!