2016-01-26 4 views
2

У меня есть программа, которая отлично работает, если есть \n в конце файла ifstream.Как проверить, есть ли новая строка или нет в конце файла ifstream. (C++)

Задача была такой: Определить структуру продукта (название, категория, цена, количество на складе). Из файла trgovina.txt (может уже содержать предопределенные продукты «Как и в картине я писал.) Через функции:

  1. 1 нагрузка на продукты в массиву из существующего файла tgovina.txt
  2. 2 Разрешить печать имени продукта из файла proizvodi.txt (каждый продукт в новой строке)
  3. включить поиск продуктов по категориям (загрузить категорию от пользователя и распечатать названия продуктов и категорий на экране и в файл, который назван «обязательной категорией»)
  4. Включить печать продукта, которое меньше 10 на складе в файле lessthen10.txt
  5. Разрешить печать самых дорогих и самых дешевых продуктов на дисплее
  6. Разрешить ввод новых продуктов в базу данных (записать их в файл trgovina.txt)

проблема начинается here: если человек перестает писать на первое желтого маркера, я хотел бы добавить новую строку, так что, когда я хочу, чтобы добавить новый текст, он начнется новая линия. Если в конце текстового файла уже есть новая строка, я хочу просто продолжить запись без добавления новой строки.

Вторая проблема заключается в том, что в исходном файле нет текста: в этом случае я не хочу добавлять новую строку.

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 из текстового файла после запуска нескольких новых строк из этого кода. Он положил новую строку сверху, если файл был пуст, если он не работает.

+0

У вас есть подсказки и 'getlines' во фрагменте кода, указывая на интерактивный вход, но вы 'чтение из текстового файла, где несколько частей данных находятся в одной строке. Это, скорее всего, неверно. Вы хотите читать в каждом поле по одному или читать строку и анализировать поля из нее. 'getline' не будет работать, когда будет достигнут конец ввода. Если есть пустая строка, вы будете читать пустую строку. – AndyG

ответ

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   ... 
+0

Я попробую, спасибо :) – Kira

+0

'seekg' вызывает' filebuf :: seekoff', который, в свою очередь, определен в терминах функции C 'fseek'. Соответственно, единственная допустимая позиция при использовании 'end' -' 0' для файла, открытого в текстовом режиме.Это не значит, что ваш код не будет работать больше всего, если не все время, но реализация будет совершенно бесплатна даже игнорировать поиск или искать конец, а не последний символ. – user657267

+0

27.8.2.4 // 10 * Если (newoff + off) <0 * означает, что значения могут быть отрицательными, * функция присваивает xbeg + newoff + off следующему указателю xnext * - расчет. Почти то же самое для fseek. –