从具有不同行长度的文本文件填充2D char数组

时间:2018-01-21 02:20:40

标签: c++ arrays

我正在尝试从文本文件填充2D char数组,如下所示:

Bob
Jill
Mike
Steven

并且我不确定如何在每行中使用不同长度的字符。这是我的代码:

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;


int main(){
    char names[4][7];
    string fileName = "names.txt";
    ifstream inFile(fileName);

    while(!inFile.eof()){
        for(int i=0; i<4; i++){
            for(int j=0; j<7; j++){
                inFile.get(names[i][j]);
            }
        }
    }

    for(int i=0; i<4; i++){
        for(int j=0; j<7; j++){
            cout << names[i][j];
        }
    }

    return 0;
}

这将打印

Bob
Jill
Mike
Steven????????

每个?只是一个胡言乱语的人物。我很确定这种情况正在发生,因为文本文件的每一行都不是7个字符长,所以它试图填充数组的其余部分。这样做的正确方法是什么?我认为while(!inFile.eof()){}会阻止它。

2 个答案:

答案 0 :(得分:1)

由于您使用的是C ++,因此您需要使用stringvector

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;
int main()
{
    ifstream file("file");
    string line;
    vector<string> names;

    if (file.is_open())
        while (getline(file, line))
            names.push_back(line);

    for (auto it = names.begin(); it != names.end(); ++it)
        cout << *it << '\n';

    return 0;
}

答案 1 :(得分:0)

您可以通过在此处添加大括号来突出显示C-array和固定循环大小的问题:

for(int i=0; i<4; i++){
    std::cout << '{';
    for(int j=0; j<7; j++){
        cout << names[i][j];
    }
    std::cout << '}';
}

将打印:

{Bob
Jil}{l
Mike
}{Steven<garbage>}{<garbage>}

确实,您的名字存储如下:

char names[4][7] {
    {'B', 'o', 'b','\n', 'J', 'i', 'l'},
    {'l','\n', 'M', 'i', 'k', 'e','\n'},
    {'S', 't', 'e', 'v', 'e', 'n', <garbage>},
    {<garbage>}
};

请参阅stackptr's answer进行更正。