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

чтение из файла и запись в файл. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 40, средняя оценка - 4.88
Ленка
 Аватар для Ленка
0 / 0 / 0
Регистрация: 01.08.2009
Сообщений: 24
30.11.2009, 19:05     чтение из файла и запись в файл. #1
всем привет! нужно написать программу, которая читает строку из файла. если слово содержит "*", то его удалить, "+" - не менять, остальное продублировать. получившееся вывести в новый файл. писала-писала, вот что получилось:
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++) сначала долго ругался. хотя может и не поэтому, опыт работы с си у меня очень мал((
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2009, 19:05     чтение из файла и запись в файл.
Посмотрите здесь:

C++ запись в файл и чтение из файла
Чтение из файла, запись в файл C++
запись в файл и чтение из файла C++
Запись в файл, чтение из файла C++
Чтение из файла/Запись в файл C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
30.11.2009, 19:45     чтение из файла и запись в файл. #2
Цитата Сообщение от Ленка Посмотреть сообщение
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);
}
Ленка
 Аватар для Ленка
0 / 0 / 0
Регистрация: 01.08.2009
Сообщений: 24
30.11.2009, 19:55  [ТС]     чтение из файла и запись в файл. #3
хм. а если без строк? ну в смысле строку как массив char рассматривать? нужно как-то условие while заменить?

а по поводу условия задачи - нужно удалить слова с "*", с "+" оставить без изменений, а без того и другого записать дважды.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
30.11.2009, 20:10     чтение из файла и запись в файл. #4
Цитата Сообщение от Ленка Посмотреть сообщение
а если без строк? ну в смысле строку как массив 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);
}
Ленка
 Аватар для Ленка
0 / 0 / 0
Регистрация: 01.08.2009
Сообщений: 24
30.11.2009, 20:17  [ТС]     чтение из файла и запись в файл. #5
ну мне нужно именно массивом символов(
а разве нельзя считывать по одному символу в массив до пробела, если символ один из * и +, то присваиваем по 1 определенной переменной, отвечающей за свой символ (у меня это del и nch), а после считывания проверяем, чтО лежит в каждой из переменной и выполняем то или иное действие. вроде бы логично...
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
30.11.2009, 22:47     чтение из файла и запись в файл. #6
Цитата Сообщение от Ленка Посмотреть сообщение
а разве нельзя считывать по одному символу в массив до пробела, если символ один из * и +, то присваиваем по 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 == ' ' )
        ...
дурдом, короче
Ленка
 Аватар для Ленка
0 / 0 / 0
Регистрация: 01.08.2009
Сообщений: 24
30.11.2009, 22:56  [ТС]     чтение из файла и запись в файл. #7
ааааа, поняла))) EOF это не как в паскале, это типа символ...) теперь с этим ясно =) а насчет дурдома - претензии не ко мне =) с удовольствием передала бы, но себе дороже спасибо еще раз)
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.12.2009, 04:21     чтение из файла и запись в файл. #8
Цитата Сообщение от Ленка
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
Регистрация: 01.08.2009
Сообщений: 24
16.12.2009, 18:59  [ТС]     чтение из файла и запись в файл. #9
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++. что не так-то? =(
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
18.12.2009, 01:45     чтение из файла и запись в файл. #10
Цитата Сообщение от Ленка Посмотреть сообщение
окончательная версия. не работает.
Вот Вам работающая
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);
}
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
18.12.2009, 08:15     чтение из файла и запись в файл. #11
Цитата Сообщение от Ленка
обнаружена ошибка. Приложение будет закрыто. Приносим извинения за неудобства
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++ происходит
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2009, 20:13     чтение из файла и запись в файл.
Еще ссылки по теме:

C++ Чтение из файла и запись в файл
Чтение из файла и запись в файл C++
Запись в файл, чтение из файла C++

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

Или воспользуйтесь поиском по форуму:
Ленка
 Аватар для Ленка
0 / 0 / 0
Регистрация: 01.08.2009
Сообщений: 24
18.12.2009, 20:13  [ТС]     чтение из файла и запись в файл. #12
огромное спасибо, Вы меня просто спасли!
Yandex
Объявления
18.12.2009, 20:13     чтение из файла и запись в файл.
Ответ Создать тему
Опции темы

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