【问题标题】:How to read characters from a file and store them into an array? [duplicate]如何从文件中读取字符并将它们存储到数组中? [复制]
【发布时间】:2013-03-21 01:23:00
【问题描述】:

我正在尝试获取从文件中读取的一组字符并将它们存储到数组中。

假设我正在将字符串MICHAEL 中的每个字母从我的inputFile 中提取出来:

int limit = 7;
for(int number = 0; number < limit; number++){
    inputFile >> stepc_char;
    cout << stepc_char << endl;
}

我想将它们存储到一个数组中。我该怎么做?
(请注意,我不能使用std::vector

【问题讨论】:

  • 附加代码有什么问题?
  • 给定的 sn-p 似乎工作得很好:ideone.com/vKGJo1
  • 你的“infile”的数据布局是什么?
  • 我现在要创建数组

标签: c++ arrays file character


【解决方案1】:
I then want to store them into an array

好的,您已经完成了阅读部分,因为您当前的代码已经正确读取。 要将值存储到数组中:

// (With minimal changes to your code)
char* my_array = new char[limit];
for (int number = 0; number < limit; number++) {
    inputFile >> stepc_char;
    cout << stepc_char << endl;

    my_array[number] = stepc_char;
}

完成后不要忘记delete[] my_array;。我像这样分配内存而不是做char my_array[limit]; 的唯一原因是因为给定的数组大小必须是恒定的。 (这是我可以从我的编译器中得知的)。

如果您不需要无限期地使用该数组,请在退出作用域之前立即执行delete[] my_array;

例如,如果上面的代码在 if 块中,它应该是这样的:

if (someExpression) {

    char* my_array = new char[limit];
    for (int number = 0; number < limit; number++) {
        inputFile >> stepc_char;
        cout << stepc_char << endl;

        my_array[number] = stepc_char;
    }

    // process character array

    delete[] my_array;
}

【讨论】:

  • 你能解释一下你为什么离开 my_array[limit];到 my_array[number]
  • 好吧,limit 似乎是您使用的预期字符数。 number 是您用作循环索引的 int 。如果文件中有 8 个字符,我希望 limit 等于 8,因此,我必须创建一个大小为 8 的字符数组。数字从 0 开始并在每次迭代后增加 1环形。这意味着文件中的第一个字符将存储在 my_array[0] 中,第二个字符将存储在 my_array[1] 中,依此类推,直到 my_array[7] 具有文件中的最后一个字符。
  • -1 哇,哇,哇。动态分配?做什么的?甚至带有评论“对代码的更改最少”?我对此表示怀疑,因为这会将他与该数组本身带来的内存管理联系起来。
  • 太棒了,我现在只是被这行弄糊涂了:char* my_array = new char[limit];
  • delete my_array 应该是delete [] my_array;两者不一样(取决于编译器)
【解决方案2】:

假设这个序列不会包含一个公共字符串(意味着std::string不是你要找的),那么std::vector似乎是最在这种情况下保持这个序列的适当方式。

但是由于您添加了一个不允许使用std::string 的约束,那么(为了避免自己处理内存管理)我建议可变长度数组(如果它们可用)(即如果您使用 GCC,请参阅 Why aren't variable-length arrays part of the C++ standard?):

char myArray[limit];
for(int i = 0; i < limit; i++)
{
    std::cin >> myArray[i];
}

请注意,在这种情况下,myArray 是一个具有自动存储持续时间的数组,其生命周期在执行超出其声明的范围时结束。

否则,您将不得不使用动态分配的数组:

char* myArray = new char[limit];
for(int i = 0; i < limit; i++)
{
    std::cin >> myArray[i];
}
delete[] myArray;                   // don't forget to clean it up

【讨论】:

  • @user1879764:然后使用我提供的第一个解决方案 :) 见ideone.com/1cplYm
  • char myArray[limit] 无法编译。您需要为大小使用常量表达式。
猜你喜欢
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多