如何从文件到结构中读取特定数量的字符
How to read specific amount of character from file to struct
我需要从此数据文件中读取20个字符:
7
Petras A. Petraitis 120 15 20 0
Jurgis Jurgutis 222 16 12 22
Rimas Jonas 138 15 15 59
Bei Lin Sin Mun 23 15 0 0
Zigmas Nosis 256 16 23 9
Romas Senasis 111 15 15 15
Jurgis Stasys Lydeka199 16 13 9
6
256 16 43 15
120 15 50 10
111 16 5 35
199 16 35 59
222 16 42 22
23 15 30 0
基本上每个字母和空间直到数字。我尝试使用read((,但是我无法与struct一起使用。我也一直在尝试使用getline((,但也对我不起作用。我一直在寻找到处的地方,但是大多数教程都以直接用户输入而不是从文件中读取。
。 #include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct competition{
string name; // athletes name
int athleteNum; // number
int startHours; // starting time: hours
int startMin; // starting time: minutes
int startSec; // starting time: seconds
};
int main()
{
ifstream duom ("U2.txt");
competition athletes[30];
int n; // amount of athletes
duom >> n;
for (int i=0; i<n; i++){
duom.getline(athletes[i].name, 20);
}
return 0;
}
使用getline((代码不编译,因此我可能会弄错了语法,并且read((似乎不适用于struct。
你几乎正确。istream::getline()
在第一个参数中等待char *
,但是您正在通过std::string
。请记住,如果getline
没有将符号读取到定界符(默认情况下,是行结束,这是您的情况(为输入流(duom
(设置Failbit。您需要istream::clear()
。另外,您正在混合duom >> n;
和文件读数。也许您想从文件中读取结构的信息和cin
的n
?
update
您需要使用istream::ignore()
跳过一个新的行字符。另外,您的示例具有8行的20个符号的名称,但istream::getline
提取比指定的符号少。以下代码不包含任何错误检查。
int main()
{
ifstream duom("U2.txt");
competition athletes[30];
int n; // amount of athletes
duom >> n;
duom.ignore(1);
char name[256];
for (int i = 0; i < n; i++) {
duom.getline(name, 21);
if (duom.fail())
duom.clear();
athletes[i].name = name;
duom >> athletes[i].athleteNum >>
athletes[i].startHours >>
athletes[i].startMin >>
athletes[i].startSec;
duom.ignore(1);
}
return 0;
}
如果您不想阅读其他运动员成员,也应该使用istream::ignore()
跳过它们,而不是使用duom >> ...
阅读:
duom.ignore(32); // skip up to 32 characters or 'n'
https://en.cppreference.com/w/cpp/io/basic_istream/ignore
符合我在文件组织和处理课程中的知识。每个文件记录都应具有定义的结构:固定长度字段和记录或具有固定记录大小的可变长度字段...等
so ..您必须首先定义文件的结构才能读取它。我认为上面的这些记录没有定义的结构,因此您无法读取它。
,但通常使用functions file.read((/file.write((最好使用操作员&lt;&lt;/>>, 因为在其中,您可以通过在char数组中写入对象(铸造的属性并将其添加到它(来很好地定义文件的结构。
,您可以通过在动态char []中读取记录来读取记录记录,然后使用istrstream对象通过getline函数将其属性分开,直到该属性(如果是可变字段(,或者是固定尺寸的字段,并且记录您可以说File.Read((char*(&amp; object_name,sizeof(object((
,例如,操作员">>"在变量到达空间之前输入。.getline读取直到找到定界线(默认的分界符为endl(。那么,如何从文件中读取字符串呢?我认为您无法读取该文件,因为它的记录没有某个结构。
正如Alezh指出的那样,istream::getline()
服用char*
而不是std::string
。您可以创建一个char hold[50]
变量以传递到istream::getline()
:duom.getline(hold, 50);
,然后将std::string
分配给:athletes[i].name = std::string(hold, 20);
。
同样,正如他指出的那样,duom >> n;
不会让您进入下一行。您可能需要在该行之后进行duom.ignore(20, 'n')
以在正确的行上开始。或者不首先将>>
与getline
一起使用。
,嵌套的for
循环是什么?您可以摆脱第二个for
线。
- 尝试一次将单个字符读取到大小不确定的数组中
- C++将 txt 数据和字符读取到 2D 数组中
- C++ UTF-8 瑞典语字符读取为 ASCII
- C++逐个字符读取二进制文件字符
- 逐个字符读取文件并使用<cctype>
- C 如何通过特定n字符读取TXT文件的值
- 如何使用4个字符读取C 的文本文件
- 使用C++中的字符读取具有文件 I/O 的文件
- 是否可以从C 中的文件中的线中的特定字符读取
- 将字符读取到数组
- 如何在 c++ 中逐个字符读取文件并通过 array_name[index] 访问它
- 如何从文本文件中读取,C++中逐个字符读取
- 如何将多个字符读取合并为std::向量
- 在 c++ 中逐个从文件字符读取
- C++ 中有多少个方法逐个字符读取字符串,以对每个字符执行所需的操作
- scanf 只能将 3 个字符读取到 5 位字符数组中
- 将行的前 X 个字符读取为字符串
- 逐个字符读取以查看它是否是数字
- 如何从字符**读取字符串
- 如何逐个字符读取文件的全部内容