如何从文件到结构中读取特定数量的字符

How to read specific amount of character from file to struct

本文关键字:字符 读取 文件 结构      更新时间:2023-10-16

我需要从此数据文件中读取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;和文件读数。也许您想从文件中读取结构的信息和cinn

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线。