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

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

Восстановить пароль Регистрация
 
_д_м_и_т_р_и_й_
 Аватар для _д_м_и_т_р_и_й_
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 35
20.08.2011, 17:33     работа с файлами #1
Дан текстовый файл и строка s. Если самая длинная строка файла не совпадает со строкой s, то строку s дописать в конец файла. Помогите пожалуйста написать эту программку на Си. Заранее всем огромное спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2011, 17:33     работа с файлами
Посмотрите здесь:

Работа с файлами!!! C++
C++ работа с файлами
Работа с файлами C++
C++ Работа с файлами
C++ Работа с файлами в С++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Olga_
 Аватар для Olga_
840 / 182 / 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;
}
-=ЮрА=-
Заблокирован
Автор 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;
}
Миниатюры
работа с файлами  
Вложения
Тип файла: rar string.exe.rar (16.7 Кб, 6 просмотров)
Тип файла: txt text.txt (55 байт, 11 просмотров)
Olga_
 Аватар для Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
20.08.2011, 21:46     работа с файлами #4
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Olga_., 2 файловых потока, неужели нельзя флаг "а+" использовать?
Можно, просто написано для наглядности и вынесено для красоты в функции, а не замусорено все в функции main. И ваша попытка выгрузить весь файл в буфер странна, так как памяти может не хватить и бедный пользователь (обладатель вашей программы) не поймет чего от него хотят.
schdub
 Аватар для schdub
2902 / 1246 / 222
Регистрация: 19.01.2009
Сообщений: 3,217
Завершенные тесты: 1
20.08.2011, 22:25     работа с файлами #5
Цитата Сообщение от _д_м_и_т_р_и_й_ Посмотреть сообщение
написать эту программку на Си
Ну этого нет в Си.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
bool bWrite = true;
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
str = new char[sLen + 1]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
bWrite = true;
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
delete [] str;
-=ЮрА=-
Заблокирован
Автор 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
достаточно записать єти слова в верхнем регистре...
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
21.08.2011, 16:37     работа с файлами #7
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
достаточно записать єти слова в верхнем регистре...
Что достаточно в микрософт-окружении — не достаточно в общем.
-=ЮрА=-
Заблокирован
Автор 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_ Посмотреть сообщение
пользователь (обладатель вашей программы) не поймет чего от него хотят
, ну да ладно
Nameless One
21.08.2011, 16:50
  #9

Не по теме:

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

asics
21.08.2011, 16:55
  #10

Не по теме:

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

-=ЮрА=-
Заблокирован
Автор 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);
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
21.08.2011, 17:10     работа с файлами #12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
на досуге проверте сколько времени займёт обращение к потоку 10*10^6/N=500, раз
Всего 20000 раз? Непосредственно само обращение к потоку 20000 раз займёт значительно меньше секунды (не учитывая, собственно, непосредственно чтение). Так что чтение блоками практически не уступает чтению "за раз", тем более что чтение всё-равно происходит поблочно. А поблочная обработка запросто может даже и выиграть, за счёт кэша.
Другое дело, что размер блока равный 500 выглядит несколько странновато
Olga_
 Аватар для Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
21.08.2011, 17:20     работа с файлами #13
-=ЮрА=-, в глупые дискуссии вступать нет желания, оставайтесь при своих мнениях. Подумайте на досуге о буферизации и т.д. Вот с grizlik78 поспорить иногда интересно, так как человек ОЧЕНЬ умный
А число 500 не такое уж странное, просто красивое
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2011, 10:47     работа с файлами
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
silent_1991
22.08.2011, 10:47     работа с файлами
  #14

Не по теме:

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

Yandex
Объявления
22.08.2011, 10:47     работа с файлами
Ответ Создать тему
Опции темы

Текущее время: 06:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru