Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/47: Рейтинг темы: голосов - 47, средняя оценка - 4.77
 Аватар для Ленка
0 / 0 / 0
Регистрация: 01.08.2009
Сообщений: 24

Чтение из файла и запись в файл

30.11.2009, 19:05. Показов 9895. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
всем привет! нужно написать программу, которая читает строку из файла. если слово содержит "*", то его удалить, "+" - не менять, остальное продублировать. получившееся вывести в новый файл. писала-писала, вот что получилось:
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
#include <stdio.h>
#include <stdlib.h>
 
 main(){
          FILE *fin;
          FILE *fout;
          int i, k, nch, del;
          char* str[100];
          const char* sp=" ";
          fin = fopen("in.txt", "r");
          fout= fopen ("out.txt", "w"); 
          while (!EOF) {
                i=0;
                del=0;
                nch=0;
                do{
                fread(str[i], sizeof(char), 1, fin);
                if (str[i] =="*")  del=1;
                if (str[i] =="+")  nch=1;
                }
                while (str[i]!=sp);
                if (del!=1) {
                            for (k=0; k<i+1; k++){
                                fwrite(str[i], sizeof(char), 1, fout);                             
                            }
                            fwrite(sp, sizeof(char), 1, fout);                             
                            if (nch!=1) {
                                for (k=0; k<i+1; k++){
                                fwrite(str[i], sizeof(char), 1, fout);                             
                                         }
                            fwrite(sp, sizeof(char), 1, fout);                             
                            }
                            }
                }
 fclose(fin);
 fclose(fout);
 getchar();
 return 0;
 }
проблема в том, что он видимо даже не считывает ничего из файла - я пыталась выводить строки на экран, но ничего не выходит. подозреваю, что где-то напутала с указателями, потому что компилятор (Dev C++) сначала долго ругался. хотя может и не поэтому, опыт работы с си у меня очень мал((
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.11.2009, 19:05
Ответы с готовыми решениями:

Чтение файла, чтение названия папки где находится файл, запись данных на PHP
Допустим у нас есть структура с папками типа Large -&gt; Vehicles -&gt; Firetruck_0 В этой папке лежит файл формата .dat Что нужно сделать? ...

Ввод с клавиатуры и запись в файл, чтение из файла и запись в массив, вывод из массива на экран
1.Ввод с клавиатуры и запись в файл, чтение из файла и запись в массив, вывод из массива на экран 2.Ввод с клавиатуры и запись в массив,...

Запись в файл, чтение из файла, сохранени в файл, не работают эти функции
Здравствуйте. Не работает методы: Save() — сохранение фигуры (объекта) в файл, Load() — считывание фигуры (объекта) из файла. ...

11
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
30.11.2009, 19:45
Цитата Сообщение от Ленка Посмотреть сообщение
while (!EOF)
Вот на этом всё и заканчивается. EOF - это константа. Выражение !EOF всегда будет ложным. Условие не очень понятно. Если слово содержит '*' и не содержит '+' - его пропустить, остальное - в выходной файл? Вот так как-нибудь:
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define FIN_NAME "testin.txt"
#define FOUT_NAME "testout.txt"
 
int main(void){
    FILE *fin, *fout;
    char buf[BUFSIZ], *pWord;
    
    if ( (fin = fopen(FIN_NAME, "r")) == NULL ){
        perror("Can't open input file!\n");
        exit(1);
    }
    
    if ( (fout = fopen(FOUT_NAME, "w")) == NULL ){
        perror("Can't open output file!\n");
        exit(1);
    }
    
    while ( fgets(buf, BUFSIZ, fin) ){
        for ( pWord = strtok(buf, " "); pWord != NULL; pWord = strtok(NULL, " ") ){
            if ( strchr(pWord, '*') && !strchr(pWord, '+') )
                continue;
            fprintf(fout, ( strrchr(pWord, '\n') )? "%s" : "%s ", pWord);
        }
    }
    
    fclose(fin);
    fclose(fout);
    exit(0);
}
1
 Аватар для Ленка
0 / 0 / 0
Регистрация: 01.08.2009
Сообщений: 24
30.11.2009, 19:55  [ТС]
хм. а если без строк? ну в смысле строку как массив char рассматривать? нужно как-то условие while заменить?

а по поводу условия задачи - нужно удалить слова с "*", с "+" оставить без изменений, а без того и другого записать дважды.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
30.11.2009, 20:10
Цитата Сообщение от Ленка Посмотреть сообщение
а если без строк? ну в смысле строку как массив char рассматривать?
Муторнее получится... Фактически прийдётся вместо стандартной функции поиска символа в строке свою изобретать.

Цитата Сообщение от Ленка Посмотреть сообщение
нужно удалить слова с "*", с "+" оставить без изменений, а без того и другого записать дважды.
Тогда вот так (кстати, небольшой собственный косяк подправил):
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define FIN_NAME "testin.txt"
#define FOUT_NAME "testout.txt"
 
int main(void){
    FILE *fin, *fout;
    char buf[BUFSIZ], *pWord, *pEnd;
    
    if ( (fin = fopen(FIN_NAME, "r")) == NULL ){
        perror("Can't open input file!\n");
        exit(1);
    }
    
    if ( (fout = fopen(FOUT_NAME, "w")) == NULL ){
        perror("Can't open output file!\n");
        exit(1);
    }
    
    while ( fgets(buf, BUFSIZ, fin) ){
        if ( (pEnd = strrchr(buf, '\n')) != NULL )
            *pEnd = '\0';
        for ( pWord = strtok(buf, " "); pWord != NULL; pWord = strtok(NULL, " ") ){
            if ( strchr(pWord, '*') )
                continue;
            if ( !strchr(pWord, '+' ) )
                fprintf(fout, "%s ", pWord);
            fprintf(fout, "%s ", pWord);
        }
        fputc('\n', fout);
    }
    
    fclose(fin);
    fclose(fout);
    exit(0);
}
2
 Аватар для Ленка
0 / 0 / 0
Регистрация: 01.08.2009
Сообщений: 24
30.11.2009, 20:17  [ТС]
ну мне нужно именно массивом символов(
а разве нельзя считывать по одному символу в массив до пробела, если символ один из * и +, то присваиваем по 1 определенной переменной, отвечающей за свой символ (у меня это del и nch), а после считывания проверяем, чтО лежит в каждой из переменной и выполняем то или иное действие. вроде бы логично...
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
30.11.2009, 22:47
Цитата Сообщение от Ленка Посмотреть сообщение
а разве нельзя считывать по одному символу в массив до пробела, если символ один из * и +, то присваиваем по 1 определенной переменной, отвечающей за свой символ (у меня это del и nch), а после считывания проверяем, чтО лежит в каждой из переменной и выполняем то или иное действие. вроде бы логично...
Да можно и так, но скука смертная... Это Вы уж сами как-нибудь. Выглядеть как-то так должно:
C
1
2
3
4
5
6
7
8
9
10
11
12
...
FILE *fin, *fout;
int c;
char buf[255];
...
while ( (c = fgetc(fin)) != EOF ){
    if ( c == '*' )
        ...
    else if ( c == '+' )
        ...
    else if ( c == ' ' )
        ...
дурдом, короче
2
 Аватар для Ленка
0 / 0 / 0
Регистрация: 01.08.2009
Сообщений: 24
30.11.2009, 22:56  [ТС]
ааааа, поняла))) EOF это не как в паскале, это типа символ...) теперь с этим ясно =) а насчет дурдома - претензии не ко мне =) с удовольствием передала бы, но себе дороже спасибо еще раз)
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
01.12.2009, 04:21
Цитата Сообщение от Ленка
EOF это не как в паскале, это типа символ...)
это не символ, функция возвращает это число в случае ошибки чтения или конца файла
каждый символ - это тоже число, но из таблицы ASCII

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
#include <stdio.h>
#include <string.h>
 
main()
{
    FILE *ifp, *ofp;
    char word[100];
    enum {
        YES,
        NO
    } first, remove, duplicate;
    
    ifp = fopen("file1", "r");
    ofp = stdout;
    
    first = YES;
    while (fscanf(ifp, "%99s", word) == 1) {
        remove = duplicate = NO;
        if (strchr(word, '+'))
            ;
        else if (strchr(word, '*'))
            remove = YES;
        else
            duplicate = YES;
        if (remove == NO) {
            if (first == NO)
                putchar(' ');
            else
                first = NO;    
            fprintf(ofp, "%s", word);
            if (duplicate == YES)
                fprintf(ofp, " " "%s", word);
        }
    }        
    putc('\n', ofp);
    fclose(ifp);
    return 0;
}
0
 Аватар для Ленка
0 / 0 / 0
Регистрация: 01.08.2009
Сообщений: 24
16.12.2009, 18:59  [ТС]
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 <stdlib.h>
 
 main(){
          FILE *fin;                                                            // объявление файлов ввода и вывода
          FILE *fout;
          int i, k, nch, del;
          char* str[255], c;
          const char* sp=" ";                                                    
          fin = fopen("in.txt", "r");                                           //открываем файл на чтение
          fout= fopen ("out.txt", "w");                                         //открываем файл на запись
           while ( (c = fgetc(fin)) != EOF ) {
                i=0;
                del=0;
                nch=0;
                
                do{
                i++;      
                fscanf(fin, "%c", *str[i]);                                     //считываем в переменную str[i] символ из файла
                if (str[i] =="*")  del=1;                                       //если этот символ * или +, то соответствующим 
                if (str[i] =="+")  nch=1;                                       //перменным по 1
                c=*str[i];                                                      //проверка на окончание файла
                if (c==EOF) break;}
                while (*str[i]!=*sp);                                           //считывание идет до пробела
                
                for (k=0; k<i+1; k++)                                           //запись в файл
                printf ("%c",str[i]);
                if (del!=1) {                                                   //доп.условия на запись
                            for (k=0; k<i+1; k++){
                                fwrite(str[i], sizeof(char), 1, fout);                             
                            }
                            fwrite(sp, sizeof(char), 1, fout);                             
                            if (nch!=1) {
                                for (k=0; k<i+1; k++){
                                fwrite(str[i], sizeof(char), 1, fout);                             
                                         }
                            fwrite(sp, sizeof(char), 1, fout);                             
                            }
                            }
                }
 fclose(fin);
 fclose(fout);
 getchar();
 return 0;
 }

окончательная версия. не работает. запускаю - выдается сообщение "обнаружена ошибка. Приложение будет закрыто. Приносим извинения за неудобства. и т.п.". с версией accept аналогично, компилятор - dev c++. что не так-то? =(
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
18.12.2009, 01:45
Цитата Сообщение от Ленка Посмотреть сообщение
окончательная версия. не работает.
Вот Вам работающая
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
#include <stdio.h>
#include <stdlib.h>
 
#define FIN_NAME "in.txt"
#define FOUT_NAME "out.txt"
#define WORD_BUF 255
#define SKIP_CHAR '*'
#define NODOUBLE_CHAR '+'
#define SEP_CHAR ' '
#define NEW_LINE '\n'
 
enum { INWORD = 1, SKIP = 2, NODOUBLE = 4 };
 
/*
*   читает слово из файла. если слово содержит "*", то его удалить, "+" - не менять, остальное продублировать. 
*   получившееся вывести в новый файл.
*/
 
int main(void){
    FILE *fin, *fout;
    char buf[WORD_BUF];
    int c, flags, pos;
    
    if ( ( fin = fopen(FIN_NAME, "r") ) == NULL ){
        perror("Can't open input file!\n");
        exit(1);
    }
    
    if ( ( fout = fopen(FOUT_NAME, "w") ) == NULL ){
        perror("Can't open output file!\n");
        exit(1);
    }
        
    pos = flags = 0;
    
    while ( ( c = fgetc(fin) ) != EOF ) {
        switch ( c ) {
            case SEP_CHAR :
            case NEW_LINE :
                if ( flags & INWORD ){
                    buf[pos] = '\0';
                    if ( ! ( flags & SKIP ) ){
                        pos = ( flags & NODOUBLE ) ? 1 : 2;
                        while ( pos-- )
                            fprintf(fout, "%s%c", buf, SEP_CHAR);
                    }
                    pos = flags = 0;
                }
                break;
            case SKIP_CHAR :
                flags |= SKIP;
            case NODOUBLE_CHAR :
                flags |= NODOUBLE;
            default :
                if ( pos < WORD_BUF - 1 )
                    buf[pos++] = c;
                flags |= INWORD;
                break;
        }
    }
    
    fclose(fin);
    fclose(fout);
    exit(0);
}
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
18.12.2009, 08:15
Цитата Сообщение от Ленка
обнаружена ошибка. Приложение будет закрыто. Приносим извинения за неудобства
C
1
char* str[255], c;
C
1
fscanf(fin, "%c", *str[i]);
массив указателей - это просто массив адресов, ничьих
fscanf должна принимать адрес символа в данном случае, а ей передаётся значение символа, которого ещё и нет к тому же

C
1
char str[255], c;
C
1
fscanf(fin, "%c", str+i);
и вместо fwrite(str[i], sizeof(char), 1, fout); можно юзать putc(str[i], fout);

Цитата Сообщение от Ленка
с версией accept аналогично, компилятор - dev c++. что не так-то? =(
там может на main среагировать, нужно int main поставить, если сборка в C++ происходит
1
 Аватар для Ленка
0 / 0 / 0
Регистрация: 01.08.2009
Сообщений: 24
18.12.2009, 20:13  [ТС]
огромное спасибо, Вы меня просто спасли!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.12.2009, 20:13
Помогаю со студенческими работами здесь

Открытие и чтение файла, запись в файл, помещение результата в файл
Eсть алгоритм решения задачи. Не знаю только каким способом открыть файлы и как в них что-либо записывать (для файлов f1 и f2) и помещать...

Запись в файл, чтение из файла
Каким образом можно реализовать чтение из файла только 1 строки,используя ifstream и fstream,если можно то темку про это из интернета,сам...

Чтение из файла и запись в файл
Доброго времени суток. Идея в чем: Пример входных данных из файла: 5 o 3 c 4 o 5 c 6 o 7

Запись в файл и чтение из файла
Всем привет. Кто может подсказать решение? Есть полученный заполненный массив. int A. Числа в нём от 0 до 17. Как его записать в файл...

Чтение из файла и запись в файл
скажите пож-та если у меня например есть текстовый файл и в нем записаны ФИО студентов ,оценки из пяти символов у каждого ,номер...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru