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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2016, 23:26   #1
zaira001002
Форумчанин
 
Аватар для zaira001002
 
Регистрация: 13.09.2012
Сообщений: 122
По умолчанию Подсчет количества смены знака (Си)

Файл находится по след. пути: "C:/c/test.txt". Файл содержит в себе : 6 7 8 -2
Когда я ввожу в консоле этот путь, у меня выдает неверный результат. А вот если указать в самой программе путь к файлу с помощью fin = fopen("C:/c/test.txt", "r"); то все работает верно. Почему так? Где у меня ошибки? Подскажите ,пожалуйста)

Код:
#include <stdio.h>
#include <math.h>
#define NO_FILE -1
#define NO_NOMBERS 1
#define OK 0

int process(FILE* file, int* kol_pol)
{
	int a; //число в файле
	int num1, num2;
	int otr1, otr2;
	int fl = 0;
	char c;

	// если файла не существует - возвращает значение -1
	if (file == NULL) return NO_FILE;
	else
	{ 
	// Если в файле не число - то возвращает значение 1
		rewind(file);
		while (fscanf(file, "%d", &a) != EOF)
		{
			if (fscanf(file, "%d", &a) != 1) return NO_NOMBERS;
		}
		// если в файле все числа, то найдем количество смены знака
		// считываем число с файла и определяем , положительное ли оно
		if (fl == 1) return NO_NOMBERS;
		else
		{ 
			rewind(file);
			fscanf(file, "%d", &a);
			num1 = a;
			(num1 >= 0) ? (otr1 = 1) : (otr1 = -1);
			while (fscanf(file, "%d", &a) != EOF)
			{
				num2 = a;
				(num2 >= 0) ? (otr2 = 1) : (otr2 = -1);
				if (otr1*otr2 == -1)
				{
					(*kol_pol)++;
				}
				num1 = num2;
				otr1 = otr2;
			}
			return OK;
		}
	}
}

int main(void)
{
	int kol_pol = 0;
	int e;
	FILE *fin;

	//ввод с консоли
	fin = stdin;
	
	e = process(fin, &kol_pol);

	if (e == OK) printf("%s %d %s", "count = ", kol_pol, "\n");
	if (e == NO_FILE) printf("This file hasn't", "\n");
	if (e == NO_NOMBERS) printf("In the file there're symbols ", "\n");

	return OK;
}
zaira001002 вне форума Ответить с цитированием
Старый 04.09.2016, 23:57   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Почему так?
Потому что вы нигде не считываете с консоли этот путь. Потому что вы нигде не открываете файл по этому пути.
p51x вне форума Ответить с цитированием
Старый 05.09.2016, 01:27   #3
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Я порылся у себя в базе данных программ и нашёл ту, которая запрашивает путь с консоли (у меня файл расположен c:/1.txt), потом открывает его и читает 1-у строчку выводя её попутно на экран. Поиграйся с ней.


Код:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<conio.h>
#include<cstdlib>
#include<string>
#include <fstream>

using namespace std;



int main() {
	setlocale(LC_ALL, "ru-RU");
	
	cout << "Введите полный путь до исходного файла \n";
	string in;
	getline(cin, in);
	
	char a1[15];
	fstream in1(in, ios_base::in); 
	if (!in1.is_open())                           // Проверка открылись ли все файлы
		cout << "Ошибка чтения файла\n\n\n";
	else
	{
	
		in1.getline(a1, 15);
		in1.close();
	}

	cout << endl << a1 << endl;
	

	system("pause");
	return 0;
}

[/QUOTE]



Теперь по поводу прочитать всю строчку с несколькими символами.

Можно прочитать всю строку, а потом программо разделить на части по спецсимволу пробел (" ") или попробуй так. Это чужой пример, а тебе надо только часть кода где отмечено: " // Чтение из файла INPUT.txt и вывод на экран ".

НУ ПРОБУЙ.



Код:
#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <time.h>
#include <stdlib.h>
using namespace std;

int main()
{
	setlocale(0, "rus");

	FILE *file;
	char *fname1 = "INPUT.txt";
	char *fname2 = "OUTPUT.txt";

	int S[200];
	for (int i = 0; i < 200; i++)
	{
		S[i] = 0;
	}

	int N, M, k;
	cout << "Введите N: ";
	cin >> N;
	cout << "Введите M: ";
	cin >> M;

	// Запись в файл INPUT.txt
	file = fopen(fname1, "w");
	for (int i = 0; i < N-1; i++)
	{
		fprintf(file, "%i ", i);
	}
	fprintf(file, "%i", (N-1));
	fclose(file);
	///////////////

	// Чтение из файла INPUT.txt и вывод на экран		
	file = fopen(fname1, "r");
	fseek(file, 0, SEEK_SET);
	cout << "\nИсходный массив чисел, записанный в INPUT.txt:\n";
	k = 0;
	while (!feof(file))
	{
		fscanf(file, "%i", &S[k]);        	// Чтенеие из INPUT.txt			
		cout << " " << S[k];
		k++;
	}
	fclose(file);
	/////////////////////////////////
	
	// Замена на значений -1
	cout << "\n\nБыла сделана замена М-раз\n";
	srand(time(NULL));
	while (M > 0)
	{
		k = rand() % N;
		S[k] = -1;
		M--;
	}

	// Запись в файл OUTPUT.txt
	file = fopen(fname2, "w");
	for (int i = 0; i < N - 1; i++)
	{
		fprintf(file, "%i ", S[i]);
	}
	fprintf(file, "%i", S[N-1]);
	fclose(file);
	
	// Чтение из файла OUTPUT.txt и вывод на экран		
	file = fopen(fname2, "r");
	fseek(file, 0, SEEK_SET);
	cout << "\nРезультирующий массив чисел, записанный в OUTPUT.txt:\n";
	k = 0;
	while (!feof(file))
	{
		fscanf(file, "%i", &S[k]);        	// Чтенеие из OUTPUT.txt			
		cout << " " << S[k];
		k++;
	}
	fclose(file);
	/////////////////////////////////
	
	printf("\n\nЯ ВСЕ!  Для выхода нажми любую клавишу...");
	if (!_getch()) _getch();
	return 0;
}

Особенно смотри в сами файлы OUTPUT и INPUT и сравнивай с тем, что вывело на экран (одинаково ли?).
А что будет если M>N?


дОЛЖНО ПОЛУЧИТСЯ ТАКОЕ


[/QUOTE]

Последний раз редактировалось ura_111; 05.09.2016 в 01:31.
ura_111 вне форума Ответить с цитированием
Старый 05.09.2016, 01:34   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

1. Зачем вы опять мешаете поточный ввод и старый Сишный?
2. Зачем вы опять советуете бред по чтению строки и потом ее делению?
3. Зачем вы опять прикрепляете одни и те же картинки со своим кодом?
p51x вне форума Ответить с цитированием
Старый 05.09.2016, 01:49   #5
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Код рабочий (лично проверял в С++), только не уверен насчет просто СИ (опыта не хватает с уверенностью утверждать). Пусть пробует.

p.s.1: Это потому, что больше никто не хочет ей показать рабочего примера.
p.s.2: Может получше решение и есть, но мне оно пока не известно(опыта не хватает). Приведите другое решение, а она пусть выберет лучшее.

Последний раз редактировалось ura_111; 05.09.2016 в 02:07.
ura_111 вне форума Ответить с цитированием
Старый 05.09.2016, 07:51   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Код рабочий (лично проверял в С++), только не уверен насчет просто СИ (опыта не хватает с уверенностью утверждать). Пусть пробует.
Не рабочий. В Си нет iostream и std

Цитата:
p.s.1: Это потому, что больше никто не хочет ей показать рабочего примера.
Ей он не нужен. Ей надо просто понять, что fin = stdin не делает того, чего хочется. Все остальное у нее есть.

Цитата:
p.s.2: Может получше решение и есть, но мне оно пока не известно(опыта не хватает). Приведите другое решение, а она пусть выберет лучшее.
У нее оно есть и здесь не конкурс или соревнование подлиз.

П.С. Вы так и не ответили на счет пихания картинок в каждый свой пост.
p51x вне форума Ответить с цитированием
Старый 05.09.2016, 09:13   #7
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Насчет картинок не понял что от меня требуется...

Есть возможность - пользуйся, в противном случае такой возможности не было бы. А всё что не вписывается в эту аксиому - издёвки и придирки, но я парень не гордый, поэтому мне подобное как "с гуся вода"...

Вам надо не меня просить "не размещать фотки", а админов чтобы поменяли правила использования форума (ввели ограничение на размер картинки в пикселях или ограничение на количество от одного ника... или в чем там состоит проблема; в крайнем случае, можно договорится, ввести полный запрет опубликования картинок чисто для ura_111 - было бы прикольно начинать комментарий со слов: "Мне запретили размещать картинки, поэтому попытаюсь объяснить простыми словами.... "). И только после этого, только после этого, у меня и возможности не будет "раздражать" Вас своими скринами. В противном случае работает принцип: "Разрешено все, что не запрещено".

Последний раз редактировалось ura_111; 05.09.2016 в 09:18.
ura_111 вне форума Ответить с цитированием
Старый 05.09.2016, 10:20   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А в чем смысл таких картинок-то? Все что на этой картинке (файлы с вводом и выводом, вывод консоли) легко копируется и вставляется в виде текста. И читателю удобнее скопировать, и не пропадут через год когда хостинг сдохнет, и размытия на HiDPI мониторах нет, и незрячие пользователи смогут "прочитать".
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 05.09.2016, 10:26   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

1. Ерничайте дальше. Только кроме вашей тупости это ничего больше не показывает.
2. Что дает, кроме трафика и увеличения поста, ваш скрин с вашей ИДЕ с тем же кодом, что вы привели тут же?
3. Ваша вторая половина поста вообще на грани оффтопа и овертопика, т.к. у ТС проблема в другом, а разбор решен - о чем указано в первом посте, если вы его читали.

П.С. Да, "разрешено все, что не запрещено", но должен же быть и здравый смысл хоть чуть-чуть. Вот не запрещено мне вам на голову помочиться, но я почему-то это не делаю...
p51x вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчет количества смены знака в последовательности чисел (Си) zaira001002 Помощь студентам 2 04.07.2016 09:38
Подсчет количества смены знака в последовательности чисел (Си) zaira001002 Помощь студентам 0 23.06.2016 19:45
Нахождение количества смены знака (по Си) zaira001002 Помощь студентам 1 09.07.2015 14:55
Поиск смены знака Franky21 Общие вопросы C/C++ 5 09.03.2010 00:35
Подсчитать количества знака в числе valerij Microsoft Office Excel 5 17.08.2008 16:52