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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2011, 23:10   #1
NickolayNest
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 40
Лампочка файл целых чисел с функциями создания и печати файла

выполнил задание на си: Создать файл целых чисел. Поменять местами первую и последнюю компоненты файла. Распечатать файл до и после преобразования. использовать функции создания и печати файла.
подскажите, с точки зрения грамотности кода, использования локальных и глобальных величин, декларации функций и использования параметров, все ли правильно? я только учусь, хотелось бы научиться правильно...
Код:
#include <stdio.h>
#define name "Myfile.txt"
#define n 5
FILE *fp;
int next,mas[n];
int main(){
	int i,c;
	char firstel,lastel;
	
void rectofile (int i);
void swap(int *px,int *py);  
void output_file(int c);

	rectofile(i);

	 //вывод содержимого файла на консоль.
	printf("Файл содержит до обработки:\n");
	output_file(c);
	
	swap(&mas[0],&mas[n-1]);//обмен первого и последнего элементов

	//запись в файл нового массива:
	fp = fopen(name,"w");
	for(i=0;i<n;i++)
	{
		fprintf(fp,"%-5d",mas[i]);
	}
	fclose(fp);

	//вывод содержимого файла на экран после обработки:
	printf("Файл содержит после обработки:\n");
  	output_file(c);
	return 0;
}

void rectofile (int i)
     {	
	fp = fopen(name, "w");//открытие файла для записи
	//Запись в файл:
	for (i=0;i<n;i++)
	{
		printf("введите следующее значение:\n");
		scanf("%d",&next);
		mas[i] = next;
	  	fprintf(fp,"%-5d", next);
	}
	fclose(fp);
     }	
void output_file(int c)
{
	fp = fopen(name,"r");
	c = getc(fp);	
	while (c!= EOF)
	{
	   	putchar(c);
		c = getc(fp);
	}
	fclose(fp);
	printf("\n");
}

void swap(int *px,int *py)
{
	int temp;
	temp = *px;
	*px = *py;
	*py = temp;
}
NickolayNest вне форума Ответить с цитированием
Старый 18.12.2011, 08:44   #2
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

У меня есть несколько замечаний:

1. Следующую строку я бы заменил. Так тоже, наверное, правильно, но я не встречал:
Код:
#define name "Myfile.txt"
Заменил бы на:
char* filename = "Myfile.txt";

Имя здесь о большем говорит, что это некакое-то абстрактное имя, а имя файла.

2.
Код:
#define n 5
Заменил бы на:
Код:
#define N 5
Всё, что определяется define'ом надо писать заглавными буквами

3. Переменная int next у вас используется только в одной функции, вот там её и объявите (внутри функции).

4. Проверяйте успешность открытия файла. Хотя в данном случае, наверное, это не обязательно.
Я попробовал удалить файл, и запустил, вот так:
Код:
fp = fopen(name,"w");
Файл создался, хотя он должен был создаться только при наличии опции "+"
Код:
fp = fopen(name,"w+");
Но если вы будите отрывать файл для чтения, то обязательно делайте так:
Код:
    if (fp == NULL) {
        fprintf(stderr, "error: can't open file \"%s\"\n", name);
        return 1;
    }
Тогда у вас сообщение об ошибке сохранится в stderr. stderr - стандартный поток ошибок, который по умолчанию выводится на экран при запуске через консоль.

return 1; - я читал в K&R, что среде (окружению, ОС) нужно возвращать ноль при нормальном завершении и единицу при завершении с ошибкой.

Вы сможете запустить свою программу из командной строки, вот так:
Код:
progNickolayNest 2>report.txt
Создастся файл report.txt, где будет строка error: can't open file "Myfile.txt"

0 - дескриптор стандартного потока ввода (stdin)
1 - дескриптор стандартного потока вывода (stdout)
2 - дескриптор стандартного потока ошибок (stderr)

В вашей программе и это, думаю, не обязательно, так как вряд ли за время работы программы кто-то и что-то удалит файл. Это просто на будущее

P.S. Кернигана и Ритчи читаете?

Последний раз редактировалось 8Observer8; 18.12.2011 в 08:50.
8Observer8 вне форума Ответить с цитированием
Старый 18.12.2011, 16:33   #3
NickolayNest
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 40
По умолчанию спасибо за комментарий! :)

Уже исправил, добавил, только не совсем понял:
Цитата:
progNickolayNest 2>report.txt
пробовал вместо progNickolayNest писать имя моей программы, создается файл report.txt с текстом:
Цитата:
lab3.c: команда не найдена
в принципе это не столь важно, главное, работа сделана.
А Кернигана и Ритчи читаю, просто не все бывает понятно. Да и не все воспринимается при чтении без практики. Взять, к примеру, стандартный поток ошибок. я знаю, что есть такая штука, а как с ней работать - не совсем понятно... Ну, думаю, это все с опытом!
или еще, непонятно, зачем в строке:
Код:
char* filename = "Myfile.txt";
после char стоит "*"? так что еще многому нужно учиться!... Еще раз спасибо!
NickolayNest вне форума Ответить с цитированием
Старый 18.12.2011, 17:38   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Цитата:
пробовал вместо progNickolayNest писать имя моей программы, создается файл report.txt с текстом
Так надо писать имя exe-файла, а не имя файла с исходным кодом.

Код:
char* filename = "Myfile.txt";
В этой стоке объявляется указатель на символ и происходит инициализация этого указателя. Выделяется память для хранения строки из символов 'M' 'y' 'f' и т.д. и с символом '\0' на конце. Теперь переменная filename хранит адрес символа 'М'. К примеру можно написать:
Код:
char c = *filename;
Теперь переменная c хранит код символа М. Этот символ можно вывести на экран:
Код:
printf("%c", c);
Ещё можно так присвоить:
Код:
char c = filename[0];
То есть к элементам строки можно обращаться, используя индексную запись filename[i].

Можно было бы написать и так:
Код:
char filename[] = "Myfile.txt";
Как видите в квадратных скобках нет значения размера массива символов. Он вычисляется компилятором в процессе компиляции.

Проверяйте всё по-шагам в отладчике. И почитайте главу "5.5 Символьные указатели и функции" в К&R.

P.S. И попробуйте всё-таки запустить exe-файл из командной строки.
8Observer8 вне форума Ответить с цитированием
Старый 18.12.2011, 22:51   #5
NickolayNest
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 40
По умолчанию

exe-файл запустил, все работает.
с отладчиком еще ни разу не работал. использую текстовый редактор в ubuntu и запускаю в терминале. В wind только установил dev c++, но пока с ним не разбирался, времени нет, скоро сессия, еще 3 лабораторные сдать до 28 декабря...
NickolayNest вне форума Ответить с цитированием
Старый 19.12.2011, 05:35   #6
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Цитата:
exe-файл запустил, все работает.
Хорошо. Теперь попробуйте запустить, используя строку:
Цитата:
progname.exe 2> report.txt
Код следующий, только не создавайте файл с именем text.txt:
Код:
#include <stdio.h>

int main () {
    char* filename = "text.txt";
    FILE* fp = fopen(filename, "r");

    if (fp == NULL) {
        fprintf(stderr, "can't open file \"%s\"\n", filename);
        return 1;
    }

    fclose(fp);
    return 0;
}
Напомню, что чиcло 2 - это дескриптор стандартного потока ошибок (в unix системах это дескриптор файла стандартного потока ошибок). Он называется stderr. Когда программа запускается, то все ошибки сохраняются в stderr (файл в unix системах) Символ '>' означает "перенаправляется", т.е. запись progname.exe 2> report.txt означает запустить программу progname.exe и копировать данные (текст) из stderr в файл report.txt. Хотя с именно "копированием" я вам может набрехал (как там всё внутри усроено я не знаю), но факт в том что данные об ошибках окажутся в файле report.txt. Заметьте, что printf() использует stdout (дескриптор - 1). И если написать в командной строке:
Цитата:
progname.exe 1> report.txt
то весь вывод программы перенаправляется в файл.

У стандартного потока ошибок есть особенность, и она в том, что в случае ошибки(ок), вывод (информация об ошибках) всё-равно попадёт на терминал, даже если вы перенаправляете его в файл 2>report.txt.

P.S. Поэкспериментируйте, будет полезно
8Observer8 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
файл целых чисел soul2 Помощь студентам 2 08.11.2011 08:52
Дан файл вещественных чисел. Создать файл целых чисел, содержащий номера всех локальных максимумов в порядке возрастания zzz6 Помощь студентам 1 04.07.2011 12:59
Создать файл целых чисел с данным именем и записать в него N первых положительных четных чисел prelest' Паскаль, Turbo Pascal, PascalABC.NET 4 01.06.2011 10:27
Создать двоичный файл, записать n целых чисел. Из файла создать массив, элементы числа-палиндромы (на C) Simak63 Помощь студентам 0 30.03.2011 21:06
файл целых чисел. bunny Помощь студентам 2 23.11.2010 21:22