Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2012, 19:54   #1
vovik4385
Пользователь
 
Регистрация: 13.03.2012
Сообщений: 36
По умолчанию файловый ввод-вывод

задача заключается в следующем:Имеется текстовый файл.Разработать программу которая формирует новый файл на основе данного файла,добавляя в конец каждой строки восклицательный знак!
вот мой код, но он наверное очень кривой:
Код:
#include "stdafx.h"
#include<iostream>
#include<stdio.h>


int _tmain(int argc, _TCHAR* argv[])
{
	FILE *fp,*f;
	if((fp=fopen("C:\\рппп\\1.txt","r"))==NULL){
		perror("cannot file open.\n");
		return 1;}
	if((f=fopen("C:\\рппп\\2.txt","w+"))==NULL){
		perror("cannot file writing.\n");
		return 1;}
	while(!feof(fp)){
		fputc(fgetc(fp),f);
		char *s=new char[20];
		while(fgets(s,100,f)=='\0'){
		char c='!';
		fscanf(f,"%c",c);}
		delete []s;
	}
	fclose(fp);
	fclose(f);

	return 0;
}

Помогите пожалуйста у меня со строками постоянно проблемы!

Последний раз редактировалось ACE Valery; 28.03.2012 в 20:08.
vovik4385 вне форума Ответить с цитированием
Старый 28.03.2012, 21:32   #2
vovik4385
Пользователь
 
Регистрация: 13.03.2012
Сообщений: 36
По умолчанию

ребят ну помогите пожалуйста!!!
vovik4385 вне форума Ответить с цитированием
Старый 28.03.2012, 22:33   #3
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
он наверное очень кривой:
он невероятно кривой. вы перепутали ввод с выводом, сравниваете указатель на строку с символом, и прочая, и прочая.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 29.03.2012, 15:45   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Нужно ещё проверять, что строка не состоит из одних пробелов и табуляций. А то нелепо будет выглядеть строка с пробелами и табуляциями с восклицательным знаком на конце.

Последний '\n' в файле может и не стоять после последней строки. Это тоже надо учесть. Я это учёл в следующей программе:
Код:
#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define BSIZE 100

int main ()
{
    char *in_file_name = "input.txt";
    char *out_file_name = "output.txt";
    FILE* fp_in;
    FILE* fp_out;
    char buf[BSIZE];
    int len, i;
    int fwhite;

    // открываем файл c входными данными
    fp_in = fopen(in_file_name, "r");
    
    // проверяем, смогли ли открыть файл
    if (fp_in == NULL) {
        fprintf(stderr, "error: can't open file \"%s\"\n", in_file_name);
        return 1;
    }

    // открываем файл для записи выходных данных
    fp_out = fopen(out_file_name, "w");

    // проверяем, смогли ли открыть файл
    if (fp_in == NULL) {
        fprintf(stderr, "error: can't open file \"%s\"\n", out_file_name);
        return 1;
    }

    // обрабатываем данные
    fwhite = 1;
    while (fgets(buf, BSIZE, fp_in) != NULL) {
        len = strlen(buf);
        // проверяем, не состоит ли строка и символов пустого пространства
        for (i = 0; i < len; i++) {
            if (buf[i] != ' ' && buf[i] != '\n' && buf[i] != '\t') {
                fwhite = 0;
                break;
            }
        }

        if (len > 1 && !fwhite) {
            // учитываем, что последняя строка может не оканчиваться символом '\n'
            if (buf[len-1] != '\n') {
                buf[len] = '!';
                buf[len+1] = '\0';
            }
            else {
                buf[len-1] = '!';
            }
        }
        else {
            buf[len-1] = '\0'; 
        }
        fprintf(fp_out, "%s\n", buf);
        fwhite = 1;
    }

    printf("Completed! See file \"%s\"\n", out_file_name);

    fclose(fp_in);
    fclose(fp_out);
    return 0;
}
P.S. Но не учёл, что последние символы могут быть пробелами. Поэтому возможен вариант: "abc !". Попробуйте это учесть. И вообще, моя программа очень сырая и её можно, наверняка, улучшить.
P.S.S. Я не применял вместо:
Код:
buf[i] != ' ' && buf[i] != '\n' && buf[i] != '\t'
эту конструкцию:
Код:
!isspace(buf[i])
поэтому программа может работать с кириллицей.

Последний раз редактировалось 8Observer8; 29.03.2012 в 15:54.
8Observer8 вне форума Ответить с цитированием
Старый 29.03.2012, 18:22   #5
vovik4385
Пользователь
 
Регистрация: 13.03.2012
Сообщений: 36
По умолчанию

спасибо!!!!
vovik4385 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Файловый ввод\вывод ВаликАматор Общие вопросы C/C++ 0 27.02.2011 11:08
Файловый ввод вывод GrihaI Общие вопросы C/C++ 4 31.05.2010 02:45
Файловый ввод-вывод andrey-v-isaev Общие вопросы C/C++ 1 02.05.2010 19:54
Файловый ввод/вывод -=$V=- Общие вопросы C/C++ 8 13.12.2008 21:11
файловый ввод/вывод kot111 Общие вопросы C/C++ 1 04.02.2008 17:45