c++ - 为什么没有一个 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 字符串问题无关。
函数定义:
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。
推荐阅读
- c++ - 合并多个事件日志
- go - Go 项目中的配置格式
- go - Terratest 多个目标
- java - 循环数组以对总计值进行分组
- java - OnCodeSent Firebase 返回空字符串
- c# - 如何使用 Entity Framework 6 从 .Net 应用程序访问雪花数据库
- c++ - C++中std::move和赋值的区别
- mysql - 无法在 GROUP_CONCAT(distinct(..)) 中添加限制
- nginx - 用于 IE11/Win8.1 的 nginx-ingress https 重定向不起作用
- javascript - 使用 webpack 构建 index.html 以与开发服务器一起使用