首页 > 解决方案 > 尝试使用 cstrings 读取文本文件

问题描述

我正在尝试从“;”中提取数据 使用 cstrings 分隔文本文件。我不能在这个作业中使用字符串。我的程序可以正常打开文件并读取前 3 个字段,然后输入流进入失败状态。此外,使用 gdb,读入的第一个 var 的值 info[i].songName 显示歌曲名称已分配给 var,但末尾附加了 93 个字节的垃圾数据。我确定它与将 cstring 声明为 100 个字符有关,但我不确定如何处理源文件中每个新数据行的自定义数组大小。该程序编译但当我尝试运行它时抛出一个分段错误错误,可能是由于导致数组超出范围的原因。

这是源文件的第一行:

    Divine;Supreme Beings of Leisure;4;26;Divine Operating System

这是 song.h 中结构的定义

    5 struct song  {
    6     char song_Name[100];
    7     int min;
    8     int sec;
    9     char album[100];
    10    char artist[100];
    11 };

...这是 main.cpp

    1 //This program tracks a text file list of songs and prompts user to add, delete,
    2 //search the list.
    3
    4 #include "main.h"
    5
    6
    7
    8 int main()  {
    9
    10     int size = 0;
    11     int i = 0;
    12     ifstream infile;
    13     song info[size];
    14
    15     infile.open("songs.txt");
    16     while (!infile.is_open())   {
    17         cout << "File not found" << endl;
    18         return 1;
    19     }
    20
    21     while (!infile.eof())   {
    22         infile.getline(info[i].song_Name, 100, ';');
    23         infile.ignore();
    24         infile.getline(info[i].artist,100,';');
    25         infile >> info[i].min;
    26         infile.clear();
    27         infile  >> info[i].sec;
    28         infile.clear();
    29         infile.getline(info[i].album, 100, ';');
    30         i++;
    31 }
    32
    33     for (i = 0; i < 7; i++) {
    34         cout << info[i].song_Name << " "
    35              << info[i].min << " " << info[i].sec << " "
    36              << info[i].album << " " << info[i].artist << endl;
    37 }
    38
    39
    40  
    41 song add (char songN[100],int min, int sec, char album[100], char artist[]);
    42     return 0;

并且...最后...这是 gdb 报告的第一行的 vars 值...

Breakpoint 1, main () at main.cpp:21
21              while (!infile.eof())   {
(gdb) n
22                      infile.getline(info[i].song_Name, 100, ';');
(gdb) n
23                      infile.getline(info[i].artist,100,';');
(gdb) n
24                      infile >> info[i].min;
(gdb) n
25                      infile.clear();
(gdb) n
26                      infile.clear();
(gdb) n
27                      infile  >> info[i].sec;
(gdb) n
28                      infile.clear();
(gdb) n
29                      infile.clear();
(gdb) n
30                      infile.getline(info[i].album, 100, ';');
(gdb) n
31                      i++;
(gdb) p info[i].song_Name
$1 = "Divine\000\000\243\r@\000\000\000\000\000\001\000\000\000\000\000\000\000\320\336\377\377\377\177\000\000\020\062\335\367\377\177\000\000\001\000\000\000\000\000\000\000\030\061\335\367\377\177\000\000`Na\000\000\000\000\000\203Na\000\000\000\000\000\232Oa", '\000' <repeats 24 times>
(gdb) p info[i].min
$2 = 4
(gdb) p info[i].sec
$3 = 0
(gdb) p info[i].album
$4 = "\000\177", '\000' <repeats 42 times>, " La\000\000\000\000\000\001\000\000\000\000\000\000\000\b", '\000' <repeats 31 times>, "`Na\000\000\000\000"
(gdb)

编辑:将 song.h 更改为:

        struct song  {
  6     int min;
  7     int sec;
  8     char song_Name[];
  9     char album[];
 10     char artist[];
 11 };

...已经消除了 char vars 的问题。song_Name 现在只存储“;”之前的行中的字符 分隔符。但是第 24 行 main 中的代码以某种方式破坏了程序。它仍然可以编译,但仍然会引发分段错误,并且一次单步执行代码显示它在第 24 行中断。

标签: arraysgdb

解决方案


推荐阅读