如何检查 ifstream 文件末尾是否有换行符 (C++)

3
我有一个程序,如果 ifstream 文件的结尾有 \n ,那么它可以完美地工作。
任务如下: 定义产品结构(产品名称、类别、价格、库存数量)。 从文件trgovina.txt(可能已经包含预定义的产品。"就像我发布的图片一样") 通过以下功能: 1.从现有文件tgovina.txt中将产品加载到数组中 2.允许从文件proizvodi.txt打印产品名称(每个产品在新行中) 3.按类别启用产品搜索(从用户加载类别,并将产品和类别名称打印在屏幕上并写入名为“所需类别”的文件中) 4.启用在库存中少于10个的产品打印到文件lessthen10.txt中 5.允许在显示器上打印最昂贵和最便宜的产品 6.允许输入新产品到数据库中(将其写入文件trgovina.txt)
问题开始于此:这里:如果人在第一个黄色标记处停止编写,我想添加一个新行,以便当我想要添加新文本时,它会从新行开始。如果文本文件的结尾已经有一个新行,则我希望继续编写而不添加新行。
第二个问题是如果ofstream文件没有文本:在这种情况下,我不想添加新行。
ofstream dat("trgovina.txt", std::ios_base::app);
if (!dat)
{
  cout << "Mistake!" << endl;
  return;
}
string name;
string category;
bool a = true;
double price;
int quantity;
while (a)
{   
  **//Here I want to check if there is a "\n" sign at the end of text
    //if there isn't I want to add one, and then continue writing.
    // But if the text file was empty i dont want to add new line**

  cout << "enter the name of new product: ";
  getline(cin, name);
  dat << name << "|";
  cout << "enter the category of new product: ";
  getline(cin, category);
  dat << category << "|";
  cout << "enter the price of new product: ";
  cin >> price;
  dat << price << "|";
  cout << "enter the quantity of new product: ";
  cin >> quantity;
  dat << quantity << endl; **//This works if the txt file is empty or if 
                             //there is "\n" at the end**
  cout << "more? (1 / 0)";
  cin >> a;
  cin.ignore();
  system("cls");
};
dat.close();

抱歉我的英文不好。我在使用时遇到了一个错误。
while (a)
{   
    trgovina.seekg(-1); 
    char c;
    trgovina.get(c);
    if (c == '\n')
    {

    }
    else
    {
        dat << endl;
    }

这是运行以下代码后文本文件的图片Picture。如果文件为空,它会在顶部插入一个新行,否则它可以正常工作。


你的代码片段中使用了提示和 getlines,表明需要交互式输入,但你正在从一个文本文件中读取数据,其中多个数据部分在同一行中。这很可能是错误的。你需要逐个读取每个字段,或者读取一行并从中解析字段。当输入结束时,getline 函数会失败。如果有空行,则会读取一个空字符串。 - AndyG
1个回答

0

它是一个ofstream,因此只能写入流。您需要的是读取(以确定内部内容)和写入(以添加项目),这称为fstream。您可以在fstream中读取、写入和查找。要确定其最后一个字符是否为换行符,只需将其定位到最后一个字符并使用类似以下方式的内容进行读取:

fstream f("myfile.txt",std::fstream::in | std::fstream::out);
f.seekg(-1,is.f.end); // move the the end
char c;
f.get(c);
if (c=='\n') ...
else         ...

seekg 调用 filebuf::seekoff,它又是基于 C 函数 fseek 定义的。因此,在文本模式下打开的文件中,当使用 end 时唯一有效的位置是 0。这并不是说您的代码大多数情况下不能工作,但实现甚至可以自由地忽略寻址,或者将其定位到最后一个字符而非结尾。 - user657267
27.8.2.4 // 10 如果 (newoff + off) < 0 意味着值可能为负数,函数将 xbeg + newoff + off 分配给下一个指针 xnext 进行计算。fseek 函数也几乎相同。 - Jean-Baptiste Yunès
[filebuf.virtuals] seekoff 调用 fseek. int fseek(FILE *stream, long int offset, int whence);: 对于文本流,offset 必须为零,或者 offset 必须是与同一文件相关联的流先前成功调用 ftell 函数返回的值,并且 whence 必须为 SEEK_SET - user657267

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接