Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.94
Алексей Студент
Сообщений: n/a
#1

Работа со строками - C++

11.12.2008, 17:20. Просмотров 4274. Ответов 37
Метки нет (Все метки)

Товарищи, такая вот проблема. Есть задача. Прочитать строки из файла, а потом записать их следующим образом. Первую оставить, вторую -удалить, на месте её - пустая строка. Третью - оставить, на месте следующих двух - две пустые строки. Шестую - оставить, затем три пустые строки.
При этом все, даже пустые, строки должны быть пронумированы.

Сам написал такой вот бред, но думаю можно проще и правильнее.
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
main()
{
fstream file;
file.open("D:\1.txt",ios::in);
char a[256];
char*s=new char[];
int i=0;
while(!file.eof())
{ 
    file.getline(a,256,"\n");
    for(int j=0; j<(int)(strlen(a));j++)
    {s[i]=a[j];
    i++;}
    s[i]=";";
    i++;
}
file.close();
 
int z=0;
int d=1;
int f=1;
file.open("D:\1.txt",ios::out);
for(int b=0; b<(int)(strlen(s));b++)
{
    file<<s[b];
    if(s[b]==;)
    {
        for(int c=0; c<d; c++)
        {file<<"\n";}
        for(int e=0; e<f; e++)
        {
        while(s[b+1]!=;)
        {z=b+1;}}
    b=z;d++;f++;}
}
file.close();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2008, 17:20     Работа со строками
Посмотрите здесь:

Работа со строками - C++
Помогите пожалуйста нужна функция копирования из одной строки в другую начиная с к символов.Вот прототип void copy(char *str1,int k,char...

Работа с строками - C++
И так дано StrCChar (s, c1, s2, n) надо заменить все символы c1 в строке s, начиная с позиции n, на строку s2. Надо на с++ и желательно...

Работа со строками. - C++
Лишние пробелы. Дана строка, состоящая из слов, разделенных пробелами. Напишите программу, удаляющую лишние пробелы. Пробел считается...

Работа с строками - C++
Здравствуйте! Есть строка (предложение) надо убрать все пробелы, в т. ч. в начали конце и получить количество слов в этом предложении. ...

Работа со строками - C++
Всем доброго времени суток. Я собрался поступать (в свои-то 22, года, балбес), и сдаю ЕГЭ по информатике. Все решаю более-менее в...

Работа со строками - C++
У меня есть есть структурные переменные и указатели на них, естественно. предположим struct name() { char b=&quot;Hello!&quot;; ...

Работа со строками - C++
Имеется задачка (олимпиадная, но олимпиада уже прошла): Новый кодовый замок для владельцев нетбуков представляет головоломку не только...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Алексей Студент
0 / 0 / 0
Регистрация: 12.12.2008
Сообщений: 23
13.12.2008, 13:49     Работа со строками #21
accept, дык когда был /n, то в получившемся файле после каждой неудаленной строки оставалось по три непечатных пустых прямоугольника. Убрал - и их не стало.

FOLKEN, вот в файлкопи, которая описана, у тебя в коде, всего один аргумент. Да и судя по её описанию она копирует из файла в этот же файл.
А надо, насколько я вижу по твоему коду, скопировать из tfile в ffile. Для этого же надо 2 аргумента в описании, разве не так? Да и само описание по моему должно быть несколько другое.
Фактически прога работает в точности так, как надо, только нужно чтобы писалось в тот же файл, а не создавалось еще одного.
FOLKEN
21 / 20 / 3
Регистрация: 03.12.2008
Сообщений: 86
13.12.2008, 19:20     Работа со строками #22
функция - метод класса. смотри описание
C++
1
2
3
4
5
6
void Cl::filecopy(Cl z)
{
    int c;
     while ((c = getc(z.ifp )) != EOF)
        putc(c, ifp);
}
то есть она копирует файл, переданный в аргументе, в объект, для которого она была вызвана. У нее первый аргумент и есть этот самый объект. Вощем если надо скопировать из tfile в ffile, то
C++
1
ffile.filecopy(tfile);
accept
4820 / 3240 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.12.2008, 23:49     Работа со строками #23
этот участок можно заменить если компилятор не тянет ?:
C++
1
    fprintf(tfp, "%03d:%s", nl, (state == OUT ? line : "\n"));
на любой из этих
C++
1
2
3
4
    if (state == OUT)
        fprintf(tfp, "%03d:%s", nl, line);
    else
        fprintf(tfp, "%03d:\n", nl);
C++
1
2
3
4
5
    fprintf(tfp, "%03d:", nl);
    if (state == OUT)
        fprintf(tfp, "%s", line);
    else
        fprintf(tfp, "\n");
у меня когда я компилировал на борланде 90 года, вместо строк вообще всех выводился nil (ну типа 001:nil и тд), потому что борланд не понимает ?: внутри fprintf'a, хотя это соответствует стандарту 89 года

в lcc который я показывал тут, скомпилировалось всё нормально и в файл она нормально всё записала

из файла

Код
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
Код
001:a
002:
003:c
004:
005:
006:f
007:
008:
009:
010:j
011:
012:
013:
014:
015:o
016:
017:
018:
019:
020:
021:u
Добавлено через 1 час 48 минут 44 секунды
выяснил что происходит, короче bc3.1 поддерживает оператор ?:, но

C++
1
    fprintf(tfp, "%03d:%s", nl, (state == OUT ? line : "\n"));
содержит 2 аргумента после строки формата, если оставить один то всё работает (то есть нумерацию строк убрать, она будет распечатывать на выбор), то есть bc3.1 оператор знает но не тянет его так как надо

потому сработает вариант

C++
1
2
    fprintf(tfp, "%03d:", nl);
    fprintf(tfp, "%s", state == OUT ? line : "\n");
под виндой всё ок
Алексей Студент
0 / 0 / 0
Регистрация: 12.12.2008
Сообщений: 23
14.12.2008, 04:44     Работа со строками #24
FOLKEN, в общем вставил я в мейн оную функцию.
Получилось так
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
main()
{ Cl ffile, tfile;
    char line[MAXLINE], *p;
    long i, j, nl;
    const char *fname = "file.txt"; 
    const char *tname = "temp.txt"; 
  
    if ((ffile.SetCl(fopen("1.txt", "rb"))) == NULL)
        return 1;
 
    if ((tfile.SetCl(fopen("2.txt", "wb"))) == NULL)
        return 2;
    i = j = nl = 0;
    while ((p = fgets(line, MAXLINE, ffile.GetCl())) != NULL) 
    {
        nl++;
        if (i == 0) {
            j++;
            i = j;
            fprintf(tfile.GetCl(), "%03d: %s", nl, line);
        } else {
            i--;
            fprintf(tfile.GetCl(),"%03d: \r\n",nl);
        }    
    }
    [U]ffile.filecopy(tfile);[/U]
    fclose(ffile.GetCl());
    fclose(tfile.GetCl());
    return 0;
}
Но в исходном файле все осталось без изменений, лишь во второй файл(куда выводится результат) после строк пишется три строки одинаковых символов.
accept
4820 / 3240 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.12.2008, 17:12     Работа со строками #25
можно переделать

tmpfile() - стандартная функция возвращает указатель на темповый поток, в который можно писать как в файл, если закрыть поток все данные из него удаляются, я искал файл этот не нашёл ни в папке программы ни в темповой директории системы, т.е. с правами всё ровно

иначе темповый файл придётся ещё удалять, а судя по вашей системе это придётся вставлять метод иначе операция удаления не будет вписываться в общий фон (работа с файлами должна осуществляться в одном классе)

если будешь делать там надо добавить метод открытия не файла функцией fopen а темпового файла функцией tmpfile()
таким образом можно будет открыть как обычный файл из одного класса, так и темповый файл из него же и работать с уже открытым потоком одинаково в обоих случаях

Добавлено через 6 часов 2 минуты 4 секунды
#define - это макроопределение, можно определять символические константы, а можно определять макросы

#define IN 1
заменит в исходнике ещё перед компиляцией его в объектник все слова IN на еденицы

#define sum(a, b) (a) + (b)
заменит в исходнике все вызовы макроса sum(2, 5) на 2+5, вычислит и оставит 7
Алексей Студент
0 / 0 / 0
Регистрация: 12.12.2008
Сообщений: 23
14.12.2008, 18:03     Работа со строками #26
Я тут решил пойти нерациональным, но простым и понятным мне способом. Грубо говоря, у меня после проги, остается два файла. Первый - исходник. Второй - с результатом. Я просто еще раз открою файл с резалтом, и скопирую его содержимое построчно сначала в чаровскую переменную, потом открою исходник, и удалив его содержимое, скопирую туда содержание чаровской переменной.
Внимание вопрос - как после этого удалить файл, в котором лежали результаты?
FOLKEN
21 / 20 / 3
Регистрация: 03.12.2008
Сообщений: 86
14.12.2008, 18:35     Работа со строками #27
удалить файл можно функциями remove, DeleteFile. Заметьте, этим функциям надо передавать в качестве параметра сооответственно const char* (для _wremove - const wchar_t *) и LPCTSTR соответственно. Уж этот вопрос можно было загуглить, блин.
accept
4820 / 3240 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
15.12.2008, 01:25     Работа со строками #28
C++
1
2
    if (remove(fname) || rename(tname, fname))
        return 3;
но она не вписывается в общую программу и препод к этому придерётся, т.к. идёт особняком от всего кода
(удаляет исходный файл когда темповый сохранён на диске, потом темповый переименовывает в исходный)
если на папке запрещена запись прога остановится ещё на создании темпового файла на диске (короче прога будет работать не в каждой папке)
набери cacls /? там будет хелп как поменять права на rw, создай папку, туда скопируй прогу, потом права у папки оставь только r и увидишь результат
Алексей Студент
0 / 0 / 0
Регистрация: 12.12.2008
Сообщений: 23
15.12.2008, 16:23     Работа со строками #29
Вопросик по синтаксису удаления.
Допустим мне надо удалить файл "2.txt", лежащий в паке проекта.
Как это будет выглядеть?
C++
1
2
fstream file;
file.open("2.txt", ios::(вот здесь что писать?));
И надо ли вообще открывать и закрывать файл, чтоб его удалить? Посмотрел по двум имеющимся самоучителям, не нашел(

И еще. Хотел скопировать из 2.тхт в 1.тхт, затем 2.тхт удалить.
Приписал к имеющимуся коду следующее:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    fstream file;
    char*tmp=new char[];
    char a[256];
    int q=0;
    file.open("2.txt",ios::in);
    while(!file.eof())
    {file.getline(a,256,"\n");
    for(int k=0;k<(int)(strlen(a));k++)
    {tmp[q]=a[k];
    q++;}
    tmp[q]=";"; q++;}
    file.close();
 
    file.open("1.txt",ios::out);
    for(int k=0; k<i; k++)
    {if(tmp[k]==';') {file<<"\n";}
    if(tmp[k]!=';') {file<<tmp[k];}
    }
    file.close();
выводит следующие ошибки
Кликните здесь для просмотра всего текста
D:\Program Files\Microsoft Visual Studio\MyProjects\123\123.cpp(76) : error C2664: 'class istream &__thiscall istream::getline(char *,int,char)' : cannot convert parameter 3 from 'char [2]' to 'char'
This conversion requires a reinterpret_cast, a C-style cast or function-style cast
D:\Program Files\Microsoft Visual Studio\MyProjects\123\123.cpp(77) : error C2065: 'strlen' : undeclared identifier
D:\Program Files\Microsoft Visual Studio\MyProjects\123\123.cpp(80) : error C2440: '=' : cannot convert from 'char [2]' to 'char'
This conversion requires a reinterpret_cast, a C-style cast or function-style cast
FOLKEN
21 / 20 / 3
Регистрация: 03.12.2008
Сообщений: 86
15.12.2008, 18:01     Работа со строками #30
открой msdn, там все написано
вот тут тут даже пример есть.

accept, прав, у тебя знатный винегрет получается. Юзай его темпы и не мучайсо
Алексей Студент
0 / 0 / 0
Регистрация: 12.12.2008
Сообщений: 23
16.12.2008, 04:08     Работа со строками #31
Дело в том, что при использовании любого из кодов, предложенных acceptoм, вместо пустых строк в блокноте выводятся просто пустые прямоугольники.
Если не сложно, можете доработать оный код так, чтобы он также копировал инфу из файла 2.тхт, в 1.тхт, а затем 2.тхт удалял? То есть чтобы и до работы проги, и после ее в паке проекта был лишь один текстовый файл.
Код:
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
#include <stdio.h>
 
 
#define MAXLINE  1000    
#define IN  1            
#define OUT 0 
           
class Cl{
private: 
    FILE*ifp;
public: 
    FILE* GetCl();
    int SetCl (FILE* fts);
    void filecopy(Cl z);
    
};
 
void Cl::filecopy(Cl z)
{
    int c;
     while ((c = getc(z.ifp )) != EOF)
        putc(c, ifp);
}
 
FILE* Cl::GetCl()
{
    return ifp;
}
 
int Cl::SetCl (FILE * fts)
{
    if(fts==NULL)
        return 0;
    else
    {
        ifp=fts;
        return 1;
    }
}
 
main()
{ Cl ffile, tfile;
    char line[MAXLINE], *p;
    long i, j, nl;
    const char *fname = "file.txt"; 
    const char *tname = "temp.txt"; 
  
    if ((ffile.SetCl(fopen("1.txt", "rb"))) == NULL)
        return 1;
 
    if ((tfile.SetCl(fopen("2.txt", "wb"))) == NULL)
        return 2;
    i = j = nl = 0;
    while ((p = fgets(line, MAXLINE, ffile.GetCl())) != NULL) 
    {
        nl++;
        if (i == 0) {
            j++;
            i = j;
            fprintf(tfile.GetCl(), "%03d: %s", nl, line);
        } else {
            i--;
            fprintf(tfile.GetCl(),"%03d: \r\n",nl);
        }    
    }
 
    fclose(ffile.GetCl());
    fclose(tfile.GetCl());
 
    return 0;
}
мог бы помучится еще сам, да только время поджимает, завтра сдавать(
accept
4820 / 3240 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
16.12.2008, 06:40     Работа со строками #32
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
#include <stdio.h>
 
#define MAXLINE  1000    /* максимальная длина строки */
#define IN  1            /* внутри пропусков */
#define OUT 0            /* снаружи пропусков */
 
/* читает строки из файла, а потом записывает их определённым образом 
   первую оставить, вторую - удалить, на месте её - пустая строка и т.д.;
   с перезаписью файла */
main()
{
    void filecopy(FILE *, FILE *); // функции будет использоваться в этой области
    FILE *fp, *tfp;
    char line[MAXLINE], *p;
    int state;
    long i, j, nl;
    const char *fname = "file.txt";
        
    if ((fp = fopen(fname, "rb")) == NULL)
        return 1;
    if ((tfp = tmpfile()) == NULL)
        return 2;
    i = j = nl = 0;
    while ((p = fgets(line, MAXLINE, fp)) != NULL) { // NULL будет когда файл закончится
        nl++; // считает каждую строку
        if (i == 0) { // пока i > 0 вставлять пустые строки
            j++; // сколько пустых строк вставлять на этот раз (должно расти по условию)
            i = j; // ставится верхняя граница, которая снижается до нуля
            state = OUT; // флаг - выводить строку
        } else {
            i--; // сколько ещё пустых строк осталось вывести
            state = IN; // флаг - скрыть строку
        }
        // флаг управляет выводом:
        // что вывести строку с номером или пустую строку с номером    
        fprintf(tfp, "%03d:", nl)
        fprintf(tfp, "%s", (state == OUT ? line : "\r\n"));
    }
    fclose(fp);
    rewind(tfp); // переводит указатель темпового файла в начало, т.к. туда писались строки
    if ((fp = fopen(fname, "wb")) == NULL) // файл может иметь только право на чтение, проверим
        return 3;
    filecopy(tfp, fp);
    fclose(tfp); // стирает темповый файл
    fclose(fp);
    return 0;
}
 
/* filecopy:  копирование файла ifp в файл ofp */
void filecopy(FILE *ifp, FILE *ofp)
{
    int c;
    
    while ((c = getc(ifp)) != EOF)
        putc(c, ofp);
}
здесь поправил ошибки переносимости и для старых компиляторов и для программ которые не отображают только 0x0A

я смотрел во всех блокнотах которые у меня есть в виндовс и пропустил обычный стандартный
даже в консоли делал type file.txt и всё выводит там без квадратов

насчёт подходящего кода, тебе всё равно придётся делать rewind и remove потом

я чо-то пригляделся что тут
C++
1
2
3
4
    Cl ffile, tfile;
 
    if ((tfile.SetCl(tmpfile())) == NULL)
        return 2;
потом с ним

C++
1
    tfile.rewind();
метод надо создать

потом
C++
1
    ffile.filecopy(tfile);
тоже нужно чтобы работало

остальное вроде если работает то ничо не менять
в итоге у тебя есть файл, создаётся темповый файл где-то там неважно, потом к нему применяются методы которые годятся для любого файла (их надо описать чтобы они работали) и так может тебе поставят зачёт
Алексей Студент
0 / 0 / 0
Регистрация: 12.12.2008
Сообщений: 23
16.12.2008, 09:34     Работа со строками #33
Accept, вот теперь квадратов нет, как "\r" поставил, перестали выводится.
Мне тут сказали, что преподу можно только екзешник с тектовым файлом принести и все. Так что может и без классов проканает. А из экзешника вообще как то можно сам код достать?
accept
4820 / 3240 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
16.12.2008, 12:27     Работа со строками #34
он может определить на чём написан был код на C или C++ туда добавляется стандартная библиотека у меня для Hello, world! различаются экзешники, но если он так задал, значит ему пофигу, значит ставит просто так, гасить будет летом
Алексей Студент
0 / 0 / 0
Регистрация: 12.12.2008
Сообщений: 23
19.12.2008, 10:43     Работа со строками #35
Еще один маленькие вопросы нарисовались.
Код
"%03d:%s",
Зачем нужна данная запись в фпринте?
Код
if ((fp = fopen(fname, [U]"rb"[/U]))
А также что означают вот эти "rb" и "wb" в аргументах фоупена? То, зачем открываем файл - для записи или чтения?

И в данной записи, зачем файловые переменные проверяются на то, не равны ли они NULL? И зачем после этого возвращаются 1 и 2?
Код
 if ((fp = fopen(fname, "rb")) == NULL)
        return 1;
    if ((tfp = tmpfile()) == NULL)
        return 2;
accept
4820 / 3240 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
19.12.2008, 12:09     Работа со строками #36
%03d

%3d
вставить десятичное число в поле минимум из трёх символов

%03d
вставить десятичное число в поле минимум из трёх символов, а если оно короче то поставить не пробелы а нули

fopen(fname, "rb")
первое имя файла
второе режим открытия
r - read
w - write
a - append (это write только с присоединением к файлу, а не затиранием)
b - binary (двоичный режим, работает не с набором строк, рассматривая символы конца строки, а с набором байтов, рассматривая символы (или символ) конца строки как просто символ в потоке остальных символов; для виндовс необходимо ставить иначе могут быть глюки какие-то)

функция fopen возвращает NULL в случае ошибки, если она не сможет найти файл, она не сможет его открыть, работать дальше не с чем, программа выходит а код завершения сообщает в систему: так принято что система ноль считает успешным завершением программы, потому все программы возвращают ноль в качестве успешного выполнения и не ноль в качестве неуспешного)
echo %errorlevel%
после любой программы набери и выведется код завершения последней программы
т.к. успешное завершение успешно всегда одинаково а ошибки бывают разные то успех только ноль, а ошибки нумеруются по мере поступления, в идеале на каждую ошибку свой код
ещё делают сообщения для пользователя, коды завершения нужны главным образом процессам (например когда включаешь прогу в скрипт (в виндовс пакетные файлы .bat), то прямо в скрипте можно узнать отработала ли прога или завершилась с ошибками, таким образом можно создавать сложные скрипты, опирающиеся на кучу разных программ, если они все правильно возвращают коды выполнения, то скрипт будет работать однозначно и хорошо информировать пользователя об этапах своей работы)
Rendll
0 / 1 / 0
Регистрация: 04.12.2008
Сообщений: 63
21.12.2008, 12:05     Работа со строками #37
Может ктота подскажет как сделать так чтоб можна было сохранять даные в файл, имя файла задаёт пользователь, а потом чтоб можна было с етого файла прочитать ети даные. ТОесть пользователь вводит под каким именем сохр, и с какого файла прочитать даные, вот так вот!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2008, 00:35     Работа со строками
Еще ссылки по теме:

Работа со строками - C++
Доброго времени суток! Пробую создать программу, которая разделяет строку на слова, убирает из них последующие включения первой буквы, и...

Работа со строками - C++
Дана последовательность, содержащая от 2 до 50 слов, в каждом из которых от 1 до 8 строчных (маленьких) латинских букв; между соседними...

Работа со строками C++ - C++
Задание: Запросить у пользователя массив из 10 строк и вывести на экран те, которые равны слову «Ура». #include &quot;stdafx.h&quot; #include...

Работа со строками - C++
Есть задание: Код, который давали на лекции int main() { char s = { 0 }; gets_s(s); int len = strlen(s);

Работа со строками - C++
Даны два слова. Для каждой буквы первого слова определить, входит ли она во второе слово. Повторяющиеся буквы первого слова не...


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

Или воспользуйтесь поиском по форуму:
accept
4820 / 3240 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
22.12.2008, 00:35     Работа со строками #38
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
#include <stdio.h>
#include <string.h>
 
#define MAXLINE  1000   /* максимальная длина строки */
#define MAXNAME  255    /* максимальное имя файла */
 
/* сохраняет даные в файл, имя файла задаёт пользователь,
   выводит сохранённые данные */
main()
{
    void filecopy(FILE *, FILE *);
    FILE *fp;
    char line[MAXLINE], fname[MAXNAME], *p;
    
    printf("Enter file name: ");
    if ((p = fgets(fname, MAXNAME, stdin)) == NULL)
        return 1;
    sscanf(fname, "%s", fname);    
    if (fopen(fname, "r") != NULL) {
        fprintf(stderr, "error: file is exist\n");
        return 2;
    }
    if ((fp = fopen(fname, "w+")) == NULL) {
        fprintf(stderr, "error: can't create %s\n", fname);
        return 3;
    }    
    printf("Enter data:\n");
    while ((p = fgets(line, MAXLINE, stdin)) != NULL)
        fputs(line, fp);
    rewind(fp);
    putchar('\n');
    printf("Saved:\n");
    filecopy(fp, stdout);
    fclose(fp);
    return 0;
}
 
/* filecopy:  копирование файла ifp в файл ofp */
void filecopy(FILE *ifp, FILE *ofp)
{
    int c;
    
    while ((c = getc(ifp)) != EOF)
        putc(c, ofp);
}
data.txt
Код
file.txt
one two three
four
five
six seven
Код
cat data.txt | ./prog

под виндой

type data.txt | prog.exe
там нет ctrl+D чтобы обозначить конец потока, потому в winXP прога будет ждать ввода, по ctrl+С просто не выведет сохранённый файл на экран

Добавлено через 2 минуты 6 секунд
Код
[guest@localhost tmp]$ ./test
Enter file name: file.txt
Enter data:
one
two
three

Saved:
one
two
three
[guest@localhost tmp]$
это пол линем но там можно ввод закончить через ctrl+D
Yandex
Объявления
22.12.2008, 00:35     Работа со строками
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru