Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317

Вывод строк на консоль из файла

21.11.2011, 21:17. Показов 4882. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу помочь разобраться в WINAPI...
Было задание:
Обходя заданные каталоги, найдите самый большой файл, удовлетворяющий заданной маске. Выведите на консоль 3 последние строки этого файла, используя функцию CreateFile. Сделайте текущим каталог, в котором находится найденный файл. Создайте в этом каталоге свой новый каталог. Скопируйте в него найденный файл.
Во общем то интересует лишь пункт выделенный жирным шрифтом и подчёркнутый, остальное сделано почти всё (создать подкаталог и скопировать найденный файл не проблема, но сделаю позже). Прошу помочь в завершении задачи, т.к. Win API с трудом даётся и полной справки по категории нигде нет!
Вот наработки: lab.zip
Среду разработки использовал CodeBlocks, но код совместим и с другими...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.11.2011, 21:17
Ответы с готовыми решениями:

Вывод строк в консоль из файла
Данный метод должен выводить из файла 15 строк, где GetSubject_1() принимает значение 1., при условии что GetSubject_1() принимает значение...

Вывод строк на консоль - Ошибка
using System; using System.IO; using System.Text; using System.Collections.Generic; using System.Linq; namespace Lantsov { ...

Вывод большого числа строк в консоль
Как в консоли сделать, чтобы при выводе числа, выводимые в столбик, можно было все прокрутить и просмотреть? А то их так много бывает, что...

11
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
22.11.2011, 02:05
А какой пункт интересует-то? Не вижу не жирного, ни подчеркнутого. Ни в задании, ни во вложении.
0
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
22.11.2011, 06:26  [ТС]
Цитата Сообщение от GrayWolf Посмотреть сообщение
А какой пункт интересует-то? Не вижу не жирного, ни подчеркнутого. Ни в задании, ни во вложении.
Извиняюсь не полностью задание изложил, конкретно интересует вывод последних 3 строк из найденного файла используя CreateFile.
0
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
22.11.2011, 18:01  [ТС]
неужели никто не сталкивался? Уже раз 20 если не больше код переписывал, а именно часть кода отвечающего за чтение с использованием CreateFile ((

Вот код если лень качать ))

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include <windows.h>
#include <iostream>
#include<stdio.h>
 
using namespace std;
 
//---------------------------------------------------------------------------
 
 
void prosm(char** mas, int n)
 
{int i;
for (i = 0; i < n; i++) puts(mas[i]);}
 
 
char **zap_mas(int n)
{
char **hstr;
int i;
int m = 80;
hstr = new char*[n];
for (i = 0; i < n; i++) hstr[i] = new char[m];
//clrscr();
cout<<"Vvedite imena katalogov dlya poiska \n";
for (i = 0; i < n; i++) gets(hstr[i]);
return(hstr);
}
 
 
int main(int argc, char* argv[])
{
const int szBuf=256;
char cd[256];
char cBuf[szBuf];
char **dir;
char **A;
char*pDIR;
int kol,kolA;
 
 
GetCurrentDirectory(szBuf,cBuf);           // Текущий каталог
 
cout<<cBuf<<"\n";
 
cout<<"Vvedte imya katologa"<<"\n";
cin>>cd;
if (!CreateDirectory(cd,NULL)) MessageBox(NULL,"не возможно создать каталог, возможно он уже существует!","Ошибка",MB_OK);  //Создание каталога
SetCurrentDirectory(cd);          // делаем новый католог текущим
GetCurrentDirectory(szBuf,cBuf);      // определяем текущий католог
cout<<"\n"<<cBuf<<"\n";
//-------- Поиск-------
char p[20];
 
cout<<"Vvedite masku faila \n";
cin>>p;
WIN32_FIND_DATA fl;
HANDLE hf;
SYSTEMTIME t;
FILETIME f;
hf=FindFirstFile(p,&fl);
FileTimeToLocalFileTime(&fl.ftCreationTime,&f);
FileTimeToSystemTime(&f,&t);
cout<<"\n Imia faila: "<<fl.cFileName<<" vremya "<<t.wDay<<"."<<t.wMonth<<"."<<t.wYear<<" "<<t.wHour<<":"<<t.wMinute<<"\n";
 
while(FindNextFile(hf,&fl))
{
 FileTimeToSystemTime(&f,&t);
cout<<"\n Imia faila: "<<fl.cFileName<<" vremya "<<t.wDay<<"."<<t.wMonth<<"."<<t.wYear<<" "<<t.wHour<<":"<<t.wMinute<<"\n";
}
 
 
 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
char fName[100];
char fpName[100];
char g[10];
int szDir=256;
char dirName[szDir];
int i;
DWORD32 fSize = 0;
DWORD32 fPrimeSize = 0;
 
SetCurrentDirectory("C:\\CodeBlocks_projects\\lab");
GetCurrentDirectory(szDir,dirName);
cout<<"\n"<<dirName<<"\n";
 
cout<<"\n Vvedite kolichestvo katalogov dlya poiska \n";
 
cin>>kol;
dir = zap_mas(kol+1);
cout<<"\n";
prosm(dir,kol+1);
cout<<"\n";
cout<<"\n Vvedite masku failov \n";
 
cin>>g;
 
WIN32_FIND_DATA fl2;
HANDLE hf2;
 
for(i=1;i<kol+1;i++) {
    fSize = 0;
SetCurrentDirectory("C:\\CodeBlocks_projects\\lab");
SetCurrentDirectory(dir[i]);
cout<<"\n"<<i;
cout<<"\n"<<dir[i];
hf2 = FindFirstFile(g,&fl2);
cout<<"\n imya faila: "<<fl2.cFileName<<" razmer: "<<fl2.nFileSizeLow<<"\n";
if(fSize < fl2.nFileSizeLow) {fSize = fl2.nFileSizeLow;
strcpy(fName, fl2.cFileName);}
while(FindNextFile(hf2,&fl2))
{
 cout<<"\n imya faila: "<<fl2.cFileName<<" razmer: "<<fl2.nFileSizeLow<<"\n";
 if(fl2.nFileSizeLow > fSize)
    {
    strcpy(fName, fl2.cFileName);
     fSize = fl2.nFileSizeLow;
    }
 
}
cout<<"\n Samiy bolshoy fail: \n"<<"Name: "<<fName<<" Size "<<fSize<<" byte \n";
if(fPrimeSize < fSize){
    pDIR=dir[i];
    strcpy(fpName, fName);
    fPrimeSize = fSize;
cout<<"\n Samiy bolshoy fail iz vseh: \n"<<"Name: "<<fName<<" Size "<<fPrimeSize<<" byte \n"<<" Katalog v kotorom raspolozen: "<<pDIR<<"\n"<<"\n";
}
 
}
 
FindClose(hf);
//-----------------------------
 
SetCurrentDirectory("C:\\CodeBlocks_projects\\lab");
SetCurrentDirectory(pDIR);
GetCurrentDirectory(szDir,dirName);
cout<<"\n Katalog s naydennim failom: \n";
cout<<dirName<<"\n";
cout<<fpName;
HANDLE hF;
int sBuffer = 999999;
char Buffer[sBuffer];
DWORD nl;
hF = CreateFile(fpName,GENERIC_READ,0,NULL,OPEN_ALWAYS,0,NULL);
if(hF==INVALID_HANDLE_VALUE) MessageBox(NULL, TEXT("Нельзя открыть файл!"), TEXT("событие"), 0); //return 1;
 
ReadFile(hF,Buffer,sBuffer,&nl,NULL);
 
cout<<"\n"<<Buffer<<"\n"; //вот как то всё это надо перегнать в массив и взять только последние 3 строки....
 
int n;
scanf("%d",&n);
        return 0;
}
//---------------------------------------------------------------------------
0
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
22.11.2011, 18:11
CeateFile() только открывает файл, чтение производится при помощи ReadFile().
Я как думаю, навскидку. Ставим курсор в конец файла SetFilePointer(), находим, двигаясь к началу, три последних комбинации "\r\n" (перевод строки). По пути определяем идут они последовательно или между ними есть какие-то другие символы (тут банальный счетчик или логическая переменная). В итоге получаем номер символа, с которого начинается третья строка от конца. Читаем их в обратном порядке (к концу файла), разделяя по строкам, используя ту же самую комбинацию.
Немного запутанно, но это мысль навскидку...
0
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
22.11.2011, 18:37  [ТС]
Цитата Сообщение от GrayWolf Посмотреть сообщение
CeateFile() только открывает файл, чтение производится при помощи ReadFile().
Я как думаю, навскидку. Ставим курсор в конец файла SetFilePointer(), находим, двигаясь к началу, три последних комбинации "\r\n" (перевод строки). По пути определяем идут они последовательно или между ними есть какие-то другие символы (тут банальный счетчик или логическая переменная). В итоге получаем номер символа, с которого начинается третья строка от конца. Читаем их в обратном порядке (к концу файла), разделяя по строкам, используя ту же самую комбинацию.
Немного запутанно, но это мысль навскидку...
а можно хотябы пример применения, а то смысл я непонял SetFilePointer(), а зачем тогда SetEndOfFile() ?
0
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
23.11.2011, 02:00
Написано же:
Sets the physical file size for the specified file to the current position of the file pointer.
The physical file size is also referred to as the end of the file. The SetEndOfFile function can be used to truncate or extend a file.
Т.е. обрезает файл до текущей позиции курсора.
SetFilePointer() устанавливает позицию курсора в файле. Иначе как вы собираетесь по нему перемещаться?
0
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
23.11.2011, 10:18  [ТС]
Цитата Сообщение от GrayWolf Посмотреть сообщение
Написано же:
Т.е. обрезает файл до текущей позиции курсора.
SetFilePointer() устанавливает позицию курсора в файле. Иначе как вы собираетесь по нему перемещаться?
А как двигаться началу, если я установил позицию в конец файла? При попытке вывести на экран, я лицезрею пустое окно без текста....

вот кусок:
C++
1
2
3
4
5
hF = CreateFile(fpName,GENERIC_READ,0,NULL,OPEN_ALWAYS,0,NULL);
if(hF==INVALID_HANDLE_VALUE) MessageBox(NULL, TEXT("Нельзя открыть файл!"), TEXT("событие"), 0); 
SetFilePointer(hF,NULL,NULL,FILE_END);
ReadFile(hF,Buffer,sBuffer,&nl,NULL);
cout<<"\n"<<Buffer<<"\n";
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
23.11.2011, 15:56
ну так вы прочитайте хотя бы описание параметров SetFilePointer
http://msdn.microsoft.com/en-u... s.85).aspx
lDistanceToMove (2-й параметр) - смещение указателя.
то есть вам необходимо вызывать
C++
1
SetFilePointer(hF,-2,NULL,FILE_END);
и окажитесь за 2 байта до конца файл, дальше читаете их. сравниваете с '\r\n'. и т.д. по алгоритму GrayWolf
0
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
24.11.2011, 02:16
turbanoff, поправлю. Вызывать надо так:
C++
1
SetFilePointer(hF,-2,NULL,FILE_CURRENT);
и далее вызывать так:
C++
1
SetFilePointer(hF,-4,NULL,FILE_CURRENT);
чтобы считать предыдущие 2 байта. Не забываем, что после считывания 2-х байт позиция курсора изменяется.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
24.11.2011, 06:12
Цитата Сообщение от GrayWolf Посмотреть сообщение
turbanoff, поправлю. Вызывать надо так:
C++
1
SetFilePointer(hF,-2,NULL,FILE_CURRENT);
Эм, а как мы в конец-то переместимся? почему FILE_CURRENT?

FILE_CURRENT
1
The starting point is the current value of the file pointer.
При открытии вроде же мы в начала файла, а FILE_CURRENT перемещает относительно текущего положения, и получим ошибку.
0
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
24.11.2011, 13:39
turbanoff, я имел в виду после того, как мы переместим курсор в конец файла.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.11.2011, 13:39
Помогаю со студенческими работами здесь

Реализовать поиск файла в каталоге и вывод на консоль заданных атрибутов найденного файла
Приведите, пожалуйста, пример кода программы, которая ищет файлы, находящиеся в каталоге, и выдаёт на консоль имя, тип и дату последней...

Работа с Action: Вывод на консоль трех строк “2”, “4” и “6”
Что нужно дописать в 13-ю строку, чтобы результатом работы программы был вывод на консоль трех строк “2”, “4” и “6”. При этом нельзя...

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

Вывод из файла в консоль
Не получается вывести содержимое первого файла в консоль и полученное содержимое в консоль #include &quot;pch.h&quot; #include...

Вывод файла на консоль
Мне нужно, чтобы на консоль данные из файла выводились не в строку, а так как они расположены в файле, например: 78877авпв вап ав п87 ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru