【问题标题】:input from txt file to arrays从 txt 文件输入到数组
【发布时间】:2009-05-04 15:59:19
【问题描述】:

我有一个文本文件,其中一行如下:

James Dean         10 Automotive      27010.43

我需要读取该文件并将上述 4 个文件中的每一个放入数组中。

char nameArray[MAX][NAME_MAX];
int yearArray[MAX];
char departmentArray[MAX][DEP_MAX];
double payArray[MAX];


while(i < MAX && infile) {

        infile.getline(nameArray[i], 20);
        infile >> yearArray[i];
        infile.getline(departmentArray[i], 15);
        infile >> payArray[i];

        cout << nameArray[i] << "  " << yearArray[i] << "  " << departmentArray[i] << "  " << fixed << setprecision(2) << payArray[i] << endl;
        i++;
    }

代码被删减只是为了让您了解我正在尝试做什么,但是当我运行它时,我会得到类似:

James Dean         -858993460    -92559631349317830000000000000000000000000000
000000000000000000.00

感谢您的帮助。

====编辑===========================================

我从 getline 更改为 get,谢谢。我必须使用 get 而不是 >> 因为我正在阅读的某些行不仅仅是“James Dean”,它们长达 20 个字符......例如:“William K. Woodward”是另一个。

所以,如果我只使用 get,那么它会很好地读取第一行,但随后我会在第二行得到相同的混乱文本。

代码如下:

    infile.get(nameArray[i], 20);
    infile >> yearArray[i];
    infile.get(departmentArray[i], 15);
    infile >> payArray[i];

【问题讨论】:

  • 您应该使用一些分隔符,还是使用制表符?如果您使用空格,如果您也允许名称或部门使用数字,则会导致问题。

标签: c++


【解决方案1】:

getline 函数接受一个输入流和一个要写入的字符串。因此,两个getline 调用分两行读取。你的输入机制坏了。要么使用getline,要么使用流提取运算符(即&gt;&gt;),但不能同时使用两者。

如果您打算使用getline,您需要将字符串(实际上是一行输入)解析为令牌,然后将它们存储在适当类型的数组中。第二个和第四个标记是数字,因此您需要将它们从字符串转换为intdouble

operator &gt;&gt; 方法:

string name, surname;
int year;
double pay;
while (infile) {
    infile >> name >> surname >> year >> department >> pay;
    namearray[ i ] = name + " " + surname;
    // ...
    payarray[ i ] = pay;
    ++i;
}

getline 方法:

string line;
while (getline(infile, line)) {
    parse(line, tokens);
    namearray[ i ] = token[ 0 ] + " " + token[ 1 ];
    // ...
    payarray[ i ] = strTodouble(token[ 4 ]);
    ++i;   
}

// parse definition
void parse(string line, vector<string>& token) {
    // roll your own
}

double strToDouble(string s) {
   // ...
}

【讨论】:

    【解决方案2】:

    我没有看到你在哪里定义 infile 但我会假设它是一个 ifile 。在这种情况下,您应该像使用 cin 获取输入一样使用它。

    你为什么要做 getline () ? 该函数将仅在 '\n' 字符或 EOF 字符处停止。所以这意味着,你在行尾之后开始读取 int,一些随机数据。

    如果我错了,请纠正我,但第一个字符串 (James Dean) 在数字 (10) 之前是否有 20 或 19 个字符?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多