首页 > 解决方案 > 为什么没有一个 istream get 函数在这个 c 字符串中存储任何东西?

问题描述

我正在尝试完成将文件中的文本存储到 c 字符串中的非常简单的任务。出于某种原因,它只是不工作

#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

struct student
{
    char id[8];
    char responses[20];
    int score;
    double grade;
};

int main()
{
    ifstream inFile("Ch8_Ex6Data.txt");

    char answerKey[20];
    inFile.getline(answerKey, 20);

    student students[256];

    inFile.getline(students[0].id, 8);

    cout << answerKey << endl;
    cout << students[0].id;

    return 0;
}

这是 Ch8_Ex6Data.txt 的副本

TTFTFTTTFTFTFFTTFTTF
ABC54102 T FTFTFTTTFTTFTTF TF
DEF56278 TTFTFTTTFTFTFFTTFTTF
ABC42366 TTFTFTTTFTFTFFTTF
ABC42586 TTTTFTTT TFTFFFTF

answerkey完全按照它应该的方式工作,但student[0].id在 get 函数之后保持空白。我尝试使用提取运算符>>,getline()get(),但它们都没有真正起作用。我究竟做错了什么?

为清楚起见进行编辑:我想ABC54102存储在student[0].id.

标签: c++arraysstructfstreamc-strings

解决方案


这与 C 字符串问题无关。

函数定义:

istream& getline (char* s, streamsize n );

istream& getline (char* s, streamsize n, char delim );

从流中提取字符作为未格式化的输入并将它们存储s为 c-string,直到提取的字符是定界字符或n已写入字符s(包括终止的空字符)。

分隔符是第'\n'一种形式delim的换行符(s

如果到达文件结尾,该函数还将停止提取字符。如果过早到达(在写入n字符或找到之前delim),该函数设置eofbit标志。

failbit如果函数未提取任何字符,或者一旦 ( n-1) 个字符已写入 时未找到定界字符,则设置s标志。请注意,如果n-1输入序列中那些 ( ) 字符后面的字符恰好是定界字符,它也会被提取并且failbit不设置标志(提取的序列正好是n字符长)。

如果大于零,即使提取了空字符串,也会自动将空字符 ( '\0') 附加到写入的序列中。n

问题是数组char answerKey[20]不够大。

利用

char answerKey[21];
inFile.getline(answerKey, sizeof(answerKey))

//...
char id[9];
//...
inFile.getline(students[0].id, sizeof(id));

请参阅此示例

话虽如此,这不是一个很好的方法,如果您使用std::getline代替会更好。

这是一个快速示例,您可以使用并适应您的需求。

请注意,我没有使用命名空间 std


推荐阅读