写入文件 与 FStream 不起作用

Writing to file With FStream Not Working

本文关键字:FStream 不起作用 文件      更新时间:2023-10-16

我正在尝试制作一个程序,人们在其中输入他们的首选项文件,以记录他们本周想要做的事情。我做了一个巨大的 if else 声明,需要帮助我的 else 声明。我的 else 语句对用户/成员是公平的,因为他们的列表是随机选择的并创建文件。但是,else 语句创建文件,但不向其写入任何角色。这是代码:

else {
    string positions[23] =
    {   "Day_Clean" "Dinner_Cook" "Dinner_Cook" "Dinner_Clean" "Dinner_Clean" "HEB_Shop" "Costco_Shop" "Silver_Fridge" "Stove_Micowave" "Appliance_Clean" "LH_Bathrooms" "Laundry_Room" "Upstairs_Commons" "Bikeroom_Entrance_Stairs" "Little_House_Commons" "Porch_Grounds" "Recycling" "Gardening" "Condi_Fridge_Personal_Fridge" "Freezer" "Downstairs_Bathroom_1" "Downstairs_Bathroom_2" "Upstairs_Bathroom" "Big_House_Hallways"  };
      ofstream randomPrefs;
  randomPrefs.open(foo);
  int randomPrefloopcount;
  do {
  int randomPrefs1 = rand() % 25;
  randomPrefs << positions[randomPrefs1] << "n";
  randomPrefloopcount++;
} while(randomPrefloopcount <= 24);
  randomPrefs.close();

文件已创建,但它们均为空白。请帮忙!

正如Sam Varshavchik所说,你的问题在于数组中的元素数量和循环之间。

假设你的值永远不会改变,有一种更安全的方法在 c++11 中声明和使用这样的数组。

#include <array>
#include <iostream>
int main()
{
    constexpr std::size_t                           kArraySize{ 3 };
    constexpr std::array<const char *, kArraySize>  kArray {
          "hehe"
        , "hehe"
//      , "hehe" // this one would work since there is 3 elements defined
//      , "hehe" // this one would fail to compile
    };
    for (auto element : kArray)
    {
        if (element != nullptr)
        { std::cout << "element: " << element << std::endl; }
        else
        { std::cout << "element is null" << std::endl; }
    }
}

std::array 确保未由用户定义的值将被零初始化,在这种情况下,这意味着它们将被 nullptr'ed。

在 C++11 §8.5/8 中指定:

对 T 类型的对象进行值初始化意味着:

— 如果 T 是没有用户提供的(可能符合 cv 条件的)类类型 或删除默认构造函数,则对象初始化为零..., 如果 T 有一个非平凡的默认构造函数,则对象为 默认初始化;

引用从这篇文章中窃取的。

编辑,应用于您的代码,它将如下所示:

else {
    constexpr std::size_t                           kArraySize{ 23 };
    constexpr std::array<const char *, kArraySize>  kPositions { "Day_Clean", "Dinner_Cook", "Dinner_Cook", "Dinner_Clean", "Dinner_Clean", "HEB_Shop", "Costco_Shop", "Silver_Fridge", "Stove_Micowave", "Appliance_Clean", "LH_Bathrooms", "Laundry_Room", "Upstairs_Commons", "Bikeroom_Entrance_Stairs", "Little_House_Commons", "Porch_Grounds", "Recycling", "Gardening", "Condi_Fridge_Personal_Fridge", "Freezer", "Downstairs_Bathroom_1", "Downstairs_Bathroom_2", "Upstairs_Bathroom", "Big_House_Hallways"  };
    ofstream randomPrefs;
    randomPrefs.open(foo);
    std::size_t maxRandomLoop { 25 };
    for (std::size_t i = 0 ; i < maxRandomLoop ; ++i)
    {
        int randomPrefs1 = rand() % kArraySize;
        if (kPositions[randomPrefs1] != nullptr)
        { randomPrefs << kPositions[randomPrefs1] << "n"; }
    }
    randomPrefs.close();
}

重新编辑后,您忘记了数组中的逗号。

一个简单的程序来验证一个概念:

#include <iostream>
int main()
{
  static const char *tokens[] = {"Tory" "Grant"};
  static const char *mythbusters[] = {"Adam", "Jamie"};
  // Print out the quantity of elements:
  std::cout << "Elements in tokens: " << (sizeof(tokens) / sizeof(tokens[0])) << "n";
  std::cout << "Elements in mythbusters: "
            << (sizeof(mythbusters) / sizeof(mythbusters[0]))
            << "n";
  return 0;
}

这将显示字符串文本的串联和指定多个文本之间的区别。

编辑:在令牌和流言终结者之前添加"*"。