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

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

Войти
Регистрация
Восстановить пароль
 
_д_м_и_т_р_и_й_
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 35
#1

работа с файлами - C++

20.08.2011, 17:33. Просмотров 887. Ответов 13
Метки нет (Все метки)

Дан текстовый файл и строка s. Если самая длинная строка файла не совпадает со строкой s, то строку s дописать в конец файла. Помогите пожалуйста написать эту программку на Си. Заранее всем огромное спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2011, 17:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос работа с файлами (C++):

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

Работа с файлами - C++
Все привет! Возник вопрос. Имеется текстовый файл. В нем есть несколько строк. Мне необходимо изменять их и добавлять новые данные в файл. ...

Работа с файлами - C++
Вообщем стоит две задачи: 1) с помощью функций fstream в текстовом документе заменить все символы табуляции на пробелы. 2) в бинарном...

Работа с файлами - C++
Скажите поожалуйста как сделать что бы программа могла читать и записывать в любой фаил информацию т.е Могла читать из фаила и...

Работа с файлами - C++
Здравствуйте, можно ли как-то прописать код на с++, что-бы программа открывала нужную папку и копировала от туда файлы а потом все эти...

Работа с файлами - C++
На указатель ругается Possibly incorrect assignment Строки в файл записывает, но не выводит. Что не так? #include <fstream.h> ...

13
Olga_
842 / 184 / 16
Регистрация: 01.08.2011
Сообщений: 502
20.08.2011, 18:28 #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
#include<stdio.h>
#include<string.h>
#define N 500
 
// поиск максимальной (по длине) строки.
int MaxString(char *fname, char *max)
{
   FILE *f;
   char s[N];
   int max_len, len;
   if ((f = fopen(fname, "rt")) == NULL)
      return 1;
   if (fgets(max, N, f))
   {
      max_len = strlen(max);
      while (fgets(s, N, f))
      {
         len = strlen(s);
         if (len > max_len)
         {
             strcpy(max, s);
             max_len = len;
         }
      }
   }
   fclose(f);
   return 0;
}
 
// добавление в конец файла строки s
int Add(char *fname, char *s)
{
   FILE *f;
   if ((f = fopen(fname, "at")) == NULL)
      return 1;
   fputs(s, f);
   fclose(f);
   return 0;
}
 
int main()
{
   char max[N], s[N];
   fgets(s, N, stdin); // ввод строки с клавиатуры
   MaxString("c:\\a.txt", max);
   if (strcmp(s, max))
      Add("c:\\a.txt", s);
   getchar();
   return 0;
}
1
-=ЮрА=-
Заблокирован
Автор FAQ
20.08.2011, 20:22 #3
Olga_., 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
#include <stdio.h>
#include <string.h>
#include <conio.h>
 
int main()
{
    long sLen,len;
    bool bWrite = true;
    char s[1024], *str, *buf;
    FILE * f = fopen("text.txt","a+");
    if(!f)
        printf("ERROR OPEN TEXT.TXT");
    else
    {
        printf("Enter string s\r\n>");
        scanf("%[^\n]",s);
 
        fseek(f,0,SEEK_END);
        sLen = ftell(f);
        fseek(f,0,SEEK_SET);
 
        if(!(str = new char[sLen + 1]))
            printf("ALLOC MEMORY ERROR\r\n");
        else
        {
            fread(str,1,sLen,f);
            str[sLen] = '\0';
 
            sLen = 0;
            buf = strtok(str,"\n");
            while(buf)
            {
                len = strlen(buf + 1);
                if(sLen < len)
                {
                    sLen = len;
                    bWrite = true;
                    if(strcmp(buf + 1,s) == 0)
                        bWrite = false;
                }
                buf = strtok(NULL,"\n");
            }
            if(strlen(s) != sLen && bWrite)
            {
                printf("WRITE IN FILE : %s\r\n",s);
                if(!fprintf(f,"\r\n%s",s))
                    printf("WRITE IN FILE ERROR\r\n");
                else
                    printf("WRITING DONE\r\n");
            }
            delete [] str;
        }
        fclose(f);  
    }
    printf("Press any key to continue\r\n");
    getch();
    return 0;
}
1
Миниатюры
работа с файлами  
Вложения
Тип файла: rar string.exe.rar (16.7 Кб, 6 просмотров)
Тип файла: txt text.txt (55 байт, 11 просмотров)
Olga_
842 / 184 / 16
Регистрация: 01.08.2011
Сообщений: 502
20.08.2011, 21:46 #4
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Olga_., 2 файловых потока, неужели нельзя флаг "а+" использовать?
Можно, просто написано для наглядности и вынесено для красоты в функции, а не замусорено все в функции main. И ваша попытка выгрузить весь файл в буфер странна, так как памяти может не хватить и бедный пользователь (обладатель вашей программы) не поймет чего от него хотят.
0
schdub
2955 / 1300 / 239
Регистрация: 19.01.2009
Сообщений: 3,413
Завершенные тесты: 1
20.08.2011, 22:25 #5
Цитата Сообщение от _д_м_и_т_р_и_й_ Посмотреть сообщение
написать эту программку на Си
Ну этого нет в Си.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
bool bWrite = true;
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
str = new char[sLen + 1]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
bWrite = true;
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
delete [] str;
2
-=ЮрА=-
Заблокирован
Автор FAQ
21.08.2011, 16:30 #6
Цитата Сообщение от schdub Посмотреть сообщение
str = new char[sLen + 1]
Цитата Сообщение от schdub Посмотреть сообщение
delete [] str;
Так уж исторически в институтах повелось что студентам дают смесь С и С++ и запись
C++
1
str = malloc(sLen + 1);
будет мало понятна, что же касается
Цитата Сообщение от schdub Посмотреть сообщение
bool
и
Цитата Сообщение от schdub Посмотреть сообщение
true
достаточно записать єти слова в верхнем регистре...
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
21.08.2011, 16:37 #7
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
достаточно записать єти слова в верхнем регистре...
Что достаточно в микрософт-окружении — не достаточно в общем.
0
-=ЮрА=-
Заблокирован
Автор FAQ
21.08.2011, 16:43 #8
Цитата Сообщение от Olga_ Посмотреть сообщение
И ваша попытка выгрузить весь файл в буфер странна
- Olga_, где то встречали txt-ник больше пары Мб размером???При этом памяти можно выделять достаточно много до 100 Мб, лично сам malloco-м проверял при работе. Так вот скажем попадёся txt-ник Мб на 10, на быстродействие свой алгоритм тестировали?Кажется, что нет(на досуге проверте сколько времени займёт обращение к потоку 10*10^6/N=500, раз)

Цитата Сообщение от Olga_ Посмотреть сообщение
а не замусорено все в функции
- у меня не замусорено, для решения данного алгоритма достаточно стандартных функций и нет необходимость вводить новые

Цитата Сообщение от Olga_ Посмотреть сообщение
"rt"
- ну а в заключение по поводу флага "rt" вам сюда
https://bugs.php.net/bug.php?id=27573
(флаг t проходит как недекларированный, да он поддерживается, но лучше не использовать, а то вдруг что-то не сработает и несчастный
Цитата Сообщение от Olga_ Посмотреть сообщение
пользователь (обладатель вашей программы) не поймет чего от него хотят
, ну да ладно
0
Nameless One
21.08.2011, 16:50
  #9

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Так уж исторически в институтах повелось что студентам дают смесь С и С++ и запись
C++
1
str = malloc(sLen + 1);
будет мало понятна
Круто, вот это аргумент!

2
asics
21.08.2011, 16:55
  #10

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Когда мой код Вам помог, не поленитесь - нажмите СПАСИБО!
-=ЮрА=-, Поменяй подпись, а то эта нарушает правила форума, карточку схлопотаешь(п. 3.9)

2
-=ЮрА=-
Заблокирован
Автор FAQ
21.08.2011, 17:03 #11
Цитата Сообщение от Nameless One Посмотреть сообщение
str = malloc(sLen + 1);
Дмитрий, если будешь юзать код, чтоб по всем азам на Си было, подключи windows.h и замени 23-ю строчку,
с этого кода
C++
1
if(!(str = new char[sLen + 1]))
на этот
C++
1
if(!(str = malloc(sLen + 1)))
а также 52-ую
с этого кода
C++
1
delete [] str;
на этот
C++
1
free(str);
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
21.08.2011, 17:10 #12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
на досуге проверте сколько времени займёт обращение к потоку 10*10^6/N=500, раз
Всего 20000 раз? Непосредственно само обращение к потоку 20000 раз займёт значительно меньше секунды (не учитывая, собственно, непосредственно чтение). Так что чтение блоками практически не уступает чтению "за раз", тем более что чтение всё-равно происходит поблочно. А поблочная обработка запросто может даже и выиграть, за счёт кэша.
Другое дело, что размер блока равный 500 выглядит несколько странновато
1
Olga_
842 / 184 / 16
Регистрация: 01.08.2011
Сообщений: 502
21.08.2011, 17:20 #13
-=ЮрА=-, в глупые дискуссии вступать нет желания, оставайтесь при своих мнениях. Подумайте на досуге о буферизации и т.д. Вот с grizlik78 поспорить иногда интересно, так как человек ОЧЕНЬ умный
А число 500 не такое уж странное, просто красивое
0
silent_1991
22.08.2011, 10:47     работа с файлами
  #14

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
чтоб по всем азам на Си было
"Чтоб по всем азам на Си было", надо бы ещё типы приводить явно, и размер на sizeof(char) домножать.

1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2011, 10:47
Привет! Вот еще темы с ответами:

Работа с файлами С++ - C++
Перезаписать текстовый файл, выбросив из него все гласные буквы, новый файл не создавать. пожалуйста помогите.

Работа с файлами в C++ - C++
Как можно просто создать файл средствами C++? Я делаю так: ofstream out(&quot;output.txt&quot;); out.close(); И вообще, можете...

Работа с файлами в С++ - C++
Доброго времени суток! Готовлюсь к зачёту завтра. Там будет задача подобная этой: Дан текстовый файл &quot;INPUT.txt&quot;, где записаны...

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


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

Или воспользуйтесь поиском по форуму:
14
22.08.2011, 10:47
Ответ Создать тему
Опции темы

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