Как удалить из файла последнюю строку в qt ?
Хочу удалить из файла последнюю строку, используя qfile. Как это сделать по простому, не переписывая его.
user2132 ★
09.10.19 09:26:01 MSK
Почему вы упорно отказываетесь читать документацию? метод resize
Silerus ★★★★
( 09.10.19 09:34:03 MSK )
Ответ на: комментарий от Silerus 09.10.19 09:34:03 MSK

И как он определит размер, который надо передавать в resize? Читать файл всё равно придётся.
ТС: совсем по-простому не получится, файл для ОС — это набор байт, а строки это уже абстракция уровнем выше.
hobbit ★★★★★
( 09.10.19 11:11:32 MSK )
Ответ на: комментарий от hobbit 09.10.19 11:11:32 MSK

Как это сделать по простому, не переписывая его.
А где ТС сказал что читать нельзя? Ресайз самое то, нашел позицию и вперед.
LinuxDebian ★★★★
( 09.10.19 11:22:07 MSK )
Последнее исправление: LinuxDebian 09.10.19 11:22:25 MSK (всего исправлений: 1)
Ответ на: комментарий от hobbit 09.10.19 11:11:32 MSK
А никто и не спорит, читать придется и считать размер придется. Но тс хочет именно подрезать без перезаписи — кто ж ему мешает. Я бы не заморачивался и сделал через запись во временный файл с последующим переименованием.
Silerus ★★★★
( 09.10.19 11:22:57 MSK )

Как это сделать по простому, не переписывая его.
Никак, у тебя всё равно будет операция записи. А так — ищи перенос строки с конца файла, да удаляй всё, что до него
XMs ★★★★★
( 09.10.19 11:23:43 MSK )

#include int ftruncate(int fildes, off_t length); int truncate(const char *path, off_t length);
unixforum.org
C++: как удалить последнюю пустую строку из файла?
11 сообщений • Страница 1 из 1
ArkanJR Сообщения: 1164 Статус: Профан
C++: как удалить последнюю пустую строку из файла?
Сообщение ArkanJR » 09.10.2015 21:53
Имеется следующий код:
#include using namespace std; int main() < ofstream out("result.txt"); for(int i = 1; i < 11; i++) < out out.close(); return 0; >
В результате получаем файл result.txt со следующим содержимым:
1
2
3
4
5
6
7
8
9
10
За числом 10 следует пустая строка. Имеется ли возможность задать в коде программы её (пустой строки) удаление?
10% — это 0,1.
© Bizdelnick
Спасибо сказали:
Bizdelnick Модератор Сообщения: 20677 Статус: nulla salus bello ОС: Debian GNU/Linux
Re: C++: как удалить последнюю пустую строку из файла?
Сообщение Bizdelnick » 09.10.2015 22:14
09.10.2015 21:53
За числом 10 следует пустая строка.
Пустых строк не бывает. Если строка пустая — значит её нет. Если она есть — значит в ней должен быть как минимум завершающий символ перевода строки.
По идее у Вас должен был получиться файл такого содержания: «1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n». Содержащий 10 строк. Что-то не так?
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще |
в течение (часа) новичок нюанс по умолчанию |
приемлемо проблема пробовать трафик |
Спасибо сказали:
Stauffenberg Сообщения: 2042 Статус: ☮ PEACE ☮ ОС: открытая и свободная
Re: C++: как удалить последнюю пустую строку из файла?
09.10.2015 21:53
За числом 10 следует пустая строка. Имеется ли возможность задать в коде программы её (пустой строки) удаление?
За числом 10 следует символ перевода строки (\n). Вы его хотите удалить? На последнем шаге просто уберите endl.
«Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Bizdelnick Модератор Сообщения: 20677 Статус: nulla salus bello ОС: Debian GNU/Linux
Re: C++: как удалить последнюю пустую строку из файла?
Сообщение Bizdelnick » 09.10.2015 23:12
09.10.2015 23:00
За числом 10 следует символ перевода строки (\n). Вы его хотите удалить? На последнем шаге просто уберите endl.
Хорошо бы при этом ещё отдавать себе отчёт, зачем это надо. Так делать не принято, и многие программы просто проигнорируют строку, не завершённую \n, а то и заглючат при чтении такого файла.
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще |
в течение (часа) новичок нюанс по умолчанию |
приемлемо проблема пробовать трафик |
Спасибо сказали:
Kopilov Сообщения: 944 ОС: [K]Ubuntu, Debian
Re: C++: как удалить последнюю пустую строку из файла?
Сообщение Kopilov » 10.10.2015 10:13
А ещё при использовании приёма
echo "дописать в конец файла" >> файл
будет получен результат, отличный от ожидаемого.
Спасибо сказали:
ArkanJR Сообщения: 1164 Статус: Профан
Re: C++: как удалить последнюю пустую строку из файла?
Сообщение ArkanJR » 10.10.2015 12:53
09.10.2015 22:14
09.10.2015 21:53
За числом 10 следует пустая строка.
Пустых строк не бывает. Если строка пустая — значит её нет. Если она есть — значит в ней должен быть как минимум завершающий символ перевода строки.
По идее у Вас должен был получиться файл такого содержания: «1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n». Содержащий 10 строк. Что-то не так?
Хотелось бы, чтобы в файле было только 10 строк с числами, а не так:
10% — это 0,1.
© Bizdelnick
Спасибо сказали:
Bizdelnick Модератор Сообщения: 20677 Статус: nulla salus bello ОС: Debian GNU/Linux
Re: C++: как удалить последнюю пустую строку из файла?
Сообщение Bizdelnick » 10.10.2015 13:13
Ну откройте тот же файл в vim, там будет не так. Это просто особенность данного конкретного текстового редактора.
Или подсчитайте число строк с помощью wc -l и убедитесь, что их десять.
Или, наконец, посмотрите содержимое файла с помощью hexdump -C .
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще |
в течение (часа) новичок нюанс по умолчанию |
приемлемо проблема пробовать трафик |
Спасибо сказали:
yoshakar Сообщения: 259 ОС: Debian Stretch
Re: C++: как удалить последнюю пустую строку из файла?
Сообщение yoshakar » 10.10.2015 15:45
10.10.2015 12:53
Хотелось бы, чтобы в файле было только 10 строк с числами, а не так:
А можно узнать что это за редактор на снимке?
Спасибо сказали:
ArkanJR Сообщения: 1164 Статус: Профан
Re: C++: как удалить последнюю пустую строку из файла?
Сообщение ArkanJR » 11.10.2015 10:06
10.10.2015 15:45
А можно узнать что это за редактор на снимке?
AkelPad. Когда скриншот делал, не было под рукой линукс-ПК.
10.10.2015 13:13
Ну откройте тот же файл в vim, там будет не так. Это просто особенность данного конкретного текстового редактора.
Или подсчитайте число строк с помощью wc -l и убедитесь, что их десять.
Или, наконец, посмотрите содержимое файла с помощью hexdump -C .
Действительно. Интересно, а почему текстовые редакторы показывают разное количество строк?
10% — это 0,1.
© Bizdelnick
Спасибо сказали:
Kopilov Сообщения: 944 ОС: [K]Ubuntu, Debian
Re: C++: как удалить последнюю пустую строку из файла?
Сообщение Kopilov » 11.10.2015 10:51
Давайте прикинем. Сперва у Вас есть файл «ровно» с n-ю строками. В конце последней строки не стоит символ сброса (\n) — как гововрили выше, это может быть плохо по различным причинам. Во-первых, поймут не все парсеры. Во-вторых, при автоматическом дописывании новых строк первая из них склеится с последней из имевшихся.
Теперь добавим в конец символ \n. С точки зрения содержимого файла новой строки не будет, мы лишь завершим старую по общепринятому стандарту. С точки зрения GUI редактора мы, набрав последние символы в n-й строке, нажали клавишу Enter, то есть перешли на n+1-ю. Но, пока там нет ни одного символа — это не совсем строка, а некий «placeholder», в который можно только поставить курсор. Показывать ли его как строку с новым номером — вопрос субъективный. Для большинства пользователей привычнее, если да.
Спасибо сказали:
Stauffenberg Сообщения: 2042 Статус: ☮ PEACE ☮ ОС: открытая и свободная
Re: C++: как удалить последнюю пустую строку из файла?
09.10.2015 23:12
09.10.2015 23:00
За числом 10 следует символ перевода строки (\n). Вы его хотите удалить? На последнем шаге просто уберите endl.
Хорошо бы при этом ещё отдавать себе отчёт, зачем это надо.
Я исхожу из того, что ТС понимает что делает. Возможно он добавляет к этой строке еще что-то, вызывая либо следующую функцию, либо другую программу. Пример, приведенный тут, наверняка изменен.
«Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Как удалить последнюю строку в файле с
← →
jiny ( 2005-08-17 09:00 ) [0]
Использую для r/w AssignFile()
assignFile(MyFile,TmpDateTitle);
Rewrite(Myfile);
writeln(MyFile,»text»);
closeFile(MyFile);
Причем все это создается в цикле и за раз выходит по 8-10 файлов, где постоянно нужно убирать пустую строку в конце,
т.к. файлы предназначены для переноса в 1С в виде проводок,
ERT-шник писали не мы, да и пароль на нем стоит. Если в файле осталась пустая строка импорт данных прекращается.
Как быть ?
← →
alpet © ( 2005-08-17 09:23 ) [1]
Загружай файл в TStringList, потом сохраняй в новый файл все, за исключением последней строки..
var
list: TString;
s: string;
t: Text;
begin
list := TStringList.Create;
try
list.LoadFromFile (SomeFileName);
if list.count > 0 then list.Delete (list.count — 1);
list.SaveToFile (SomeFileName);
finally
list.Free;
end;
end;
← →
jiny ( 2005-08-17 09:57 ) [2]
В принципе тоже вариант, а процедура удаления напрямую из файла есть ?
← →
Leonid Troyanovsky © ( 2005-08-17 10:21 ) [3]
> jiny (17.08.05 09:57) [2]
> В принципе тоже вариант, а процедура удаления напрямую из
> файла есть ?
—
Regards, LVT.
← →
jiny ( 2005-08-17 10:30 ) [4]
Попробовал через Stringlist, все данные сначала закачал туда, а затем вызвал TmpStringFile.SaveToFile(Somefile) , что самое непонятное, когда смотрю последнюю строку в стринлисте, он показывает реально последнюю строку, где нет пустой строки, но
после .SaveToFile — добавляет в конец файла пустую строку.
Это означает, что после сохранения StringList — в конец файла добавляется 2 байта — CR и LF, так-что тебе остается укоротить файл на эти два байта. Но вприципе с TFileStream это выйдет конечно побыстрее и проще.
← →
kblc © ( 2005-08-17 12:37 ) [7]
assignFile(MyFile,TmpDateTitle);
Rewrite(Myfile);
write(MyFile,»text»);
closeFile(MyFile);
← →
George © ( 2005-08-17 23:10 ) [8]
А если через Мему?
Вроде нихде не ошибся.
← →
Наиль © ( 2005-08-18 00:27 ) [9]
>[8]
Ошибся! Должно быть Count-1.
Но в любом случае, ты повторил метод [1], только с визуальной компанентой, что само по себе, не есть гуд.
Лучший вариант по-моему [7]. Лучше правильно записать, чем исправлять ошибки.
Мой вариант укорочения на 2 байта (для разнообразия):
Var
f:File of Byte;
begin
AssignFile(f,»1.txt»); Reset(f);
Seek(f,FileSize(f)-2);
Truncate(f);
CloseFile(f);
end;
Как удалить последнюю строку в текстовом файле?
У меня есть простой текстовый файл журнала с расширением.txt с пробелом в конце этого текстового файла каждый раз, когда файл журнала генерируется из сторонней программы.
Поэтому есть какие-то методы или коды, которые я могу использовать для удаления последней строки текстового файла?
Пример текстового файла журнала:
Sun Jul 22 2001 02:37:46,73882. b,r/rrwxrwxrwx,0,0,516-128-3,C:/WINDOWS/Help/digiras.chm Sun Jul 22 2001 02:44:18,10483. b,r/rrwxrwxrwx,0,0,480-128-3,C:/WINDOWS/Help/cyycoins.chm Sun Jul 22 2001 02:45:32,10743. b,r/rrwxrwxrwx,0,0,482-128-3,C:/WINDOWS/Help/cyzcoins.chm Sun Jul 22 2001 04:26:14,174020. b,r/rrwxrwxrwx,0,0,798-128-3,C:/WINDOWS/system32/spool/drivers/color/kodak_dc.icm
Поделиться Источник 24 ноября 2010 в 06:43
6 ответов
Как насчет чего-то вроде:
var lines = System.IO.File.ReadAllLines(". "); System.IO.File.WriteAllLines(". ", lines.Take(lines.Length - 1).ToArray());
Технически, вы не удаляете строку из файла. Вы читаете содержимое файла и записываете его обратно, исключая содержимое, которое вы хотите удалить.
Этот код делает это — читает все строки в массив и записывает эти строки обратно в файл, исключая только последнюю строку. (Метод Take() (Часть LINQ) принимает указанное количество строк, что в нашем случае является длиной — 1). Здесь var lines можно прочитать как String[] lines .
Поделиться 24 ноября 2010 в 06:47
Используйте этот метод, чтобы удалить последнюю строку файла:
public static void DeleteLastLine(string filepath) < Listlines = File.ReadAllLines(filepath).ToList(); File.WriteAllLines(filepath, lines.GetRange(0, lines.Count - 1).ToArray()); >
Редактирование: Я понял, что переменная строк не существовала ранее, поэтому обновил код.
Поделиться 24 ноября 2010 в 06:49
Если вы хотите удалить последние N строк из файла без загрузки всех в память :
int numLastLinesToIgnore = 10; string line = null; Queue deferredLines = new Queue(); using (TextReader inputReader = new StreamReader(inputStream)) using (TextWriter outputReader = new StreamWriter(outputStream)) < while ((line = inputReader.ReadLine()) != null) < if (deferredLines.Count() == numLastLinesToIgnore) < outputReader.WriteLine(deferredLines.Dequeue()); >deferredLines.Enqueue(line); > // At this point, lines still in Queue get lost and won't be written >
Что происходит, так это то, что вы буферизуете каждую новую строку в очереди с размерностью numLastLinesToIgnore и выскакивает из нее строка для записи только тогда, когда очередь заполнена. Вы фактически читаете файл и можете остановить numLastLinesToIgnore строки до достижения конца файла, не зная заранее общее количество строк .
Обратите внимание, что если текст меньше numLastLinesToIgnore ,, результат будет пустым.
Я придумал это как зеркальное решение для этого: Удалить определенную строку из текстового файла?
Поделиться 18 сентября 2016 в 20:13
Вы не можете удалить конец строки, так как File.WriteAllLines автоматически добавляет его, однако вы можете использовать этот метод:
public static void WriteAllLinesBetter(string path, params string[] lines) < if (path == null) throw new ArgumentNullException("path"); if (lines == null) throw new ArgumentNullException("lines"); using (var stream = File.OpenWrite(path)) using (StreamWriter writer = new StreamWriter(stream)) < if (lines.Length >0) < for (int i = 0; i < lines.Length - 1; i++) < writer.WriteLine(lines[i]); >writer.Write(lines[lines.Length - 1]); > > >
Поделиться 25 сентября 2016 в 21:07
Я просто нахожу решение с другого сайта, и это URL https://stackoverrun.com/cn/q/627722.
С небольшим количеством строк вы можете легко использовать что-то вроде этого
string filename = @"C:\Temp\junk.txt"; string[] lines = File.ReadAllLines(filename);
Однако, по мере увеличения файлов, вы можете захотеть потоковать данные с помощью чего-то вроде этого
string filename = @"C:\Temp\junk.txt"; string tempfile = @"C:\Temp\junk_temp.txt"; using (StreamReader reader = new StreamReader(filename)) < using (StreamWriter writer = new StreamWriter(tempfile)) < string line = reader.ReadLine(); while (!reader.EndOfStream) < writer.WriteLine(line); line = reader.ReadLine(); >// by reading ahead, will not write last line to file > > File.Delete(filename); File.Move(tempfile, filename);
Поделиться 01 июля 2020 в 09:06
Это должен быть лучший вариант для использования с большими файлами.
using (StreamReader source = new StreamReader(sourceFileName)) < using (StreamWriter sw = new StreamWriter(newFileName)) < do < line = source.ReadLine(); if (source.Peek() >-1) < sw.WriteLine(line); >else < File.AppendAllText("RemovedLastLine.txt", line); >> while (line != null); > >