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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2009, 17:24   #1
FastDead2
Пользователь
 
Аватар для FastDead2
 
Регистрация: 09.05.2009
Сообщений: 12
Восклицание Чтение и Запись текста из\в файл(а), C++

Проблема вот в чём, нужно из файла(.txt) прочитать символы; текста многа, т.е. кол-ва строк многа и строки длинные.
Мне сказали что можно использовать fgets(); но эта функция читает, ток одну строку, и кол-во символов нужно задавать, а если текст большой, что кажд раз подсчиывать?) -> неудобно. и мне нужно сохранение абзацев, поэтому лишь одной строкой обойтись не могу(
И ещё: какую лучше функцию испольовать, что бы такой же большой текст записывать?

И ещё, даже когда читаю одну строку, ну как ниже, он её выводит и справа ещё какието значки приписывает, коих не должно быть
Например:
Текст в файле: hello, i'm russia.
То выводит: hello, i'm russia.ээээ««««««««юоюоюою
почему так происходит?

Вот что у меня получилось, помогите пажалуста, очень нужна помощь!!
Код:
//читаем текст из файла
printf("Vvedite kol-vo simvolov v stroke: ");
  scanf("%d", &n);
    printf("\n");
    FILE *x;
    if ((x=fopen("qw.txt","r"))==NULL)
    {printf(" Owibka otkritija fajla!!!");
    getch();}
	else
	{
    fgets(ooStr,n,x);
	}
	fclose(x);
   
   len = strlen(ooStr);
   char *oStr = new char[len];  
   char *key = new char[len];  
   char *shStr = new char[len];  

   for(i=0;i<len;i++)
   oStr[i]=ooStr[i];
   printf("\nThe initial text: ");
   puts(oStr);
    printf("\n\n");

// определяем ключ случайным образом
   printf("\nKey:  ");
   for(i = 0; i<len; i++)
   key[i]=(char)rand()%255;
   printf("%s", key);
   printf("\n\n");

// записываем ключ в файл
   	FILE *y;
	printf("Please, enter a name of a file for a key: ");
	scanf("%s",naz);
    if ((y=fopen(naz,"w"))==NULL)
    {printf(" Owibka otkritija fajla!!!");
    getch();}
	else
	{fputs(key,y);
	}
	fclose(y); 
	printf("The file is written down...\n");
FastDead2 вне форума Ответить с цитированием
Старый 09.05.2009, 17:43   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Что-то не очень понял, что требуется.

Можно читать блоками, например, по 100 символов. Вот пример.
Содержимое файла input.txt копируется в output.txt.
Код:
#include<stdio.h>

int main()
{
FILE *fin,*fout;
size_t k;
char buf[100];

fin = fopen("input.txt","r");
fout= fopen("output.txt","w");

while(!feof(fin))
 {
  k = fread(buf,sizeof(char),100,fin);
  fwrite(buf,sizeof(char),k,fout);
 }

fclose(fin);
fclose(fout);

return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 09.05.2009, 17:53   #3
FastDead2
Пользователь
 
Аватар для FastDead2
 
Регистрация: 09.05.2009
Сообщений: 12
По умолчанию

Функция fgets() читает только строку и кол-во символов нужно задавать
А как мне из файла вот такой текст прочитать, где строк многа:
Код:
Mathematische Modelle versuchen, die wesentlichen Parameter von Phдnomenen zu erfassen und diese 
in einem berechenbaren Gleichungssystem, Differentialgleichungssystem o.д. zur Vorhersage des 
beobachteten Systems zu nutzen. Berechenbarkeit meint hier sowohl die analytische Untersuchung als 
auch die Approximation mittels numerischer Verfahren. In der Regel sind auch die sogenannten 
physikalischen Modelle mathematische Modelle, allerdings solche, die sich auf physikalische 
GesetzmдЯigkeiten stьtzen.
Eine wissenschaftliche Untersuchung, die zum Ziel hat, ein System mit Hilfe eines Modells zu 
beschreiben, besteht aus den drei Arbeitsschritten Formulierung, Untersuchung und Validierung des 
Modells. Von einer Simulation spricht man tendenziell dann, wenn das Interesse nicht der Modellbildung 
gilt, sondern ein als valide angenommenes Modell als Hilfsmittel eingesetzt wird, um das modellierte 
System nдher zu untersuchen.
2:Sazary
Можешь объяснить что значит чтение блоками, я не совсем понимаю
FastDead2 вне форума Ответить с цитированием
Старый 09.05.2009, 17:56   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
А как мне из файла вот такой текст прочитать, где строк многа:
Куда именно прочитать? Вот в чем вопрос. Ведь нужно знать цель, а потом уже подбирать средства.

Цитата:
Можешь объяснить что значит чтение блоками, я не совсем понимаю
Посмотрите на приведенный мной пример.
Функция fread читает блок данных указанного размера. В данном случае, это 100 элементов размером в 1 байт. Чтение происходит в буфер (buf). Функция возвращает количество реально прочитанных символов. Это значение мы и используем, чтобы записать блок в другой файл.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 09.05.2009, 18:13   #5
FastDead2
Пользователь
 
Аватар для FastDead2
 
Регистрация: 09.05.2009
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Sazary Посмотреть сообщение
Куда именно прочитать? Вот в чем вопрос. Ведь нужно знать цель, а потом уже подбирать средства.
Вообще я в программе реализую шифр Вернама; нужно чтобы текст из файла записался в массив, потом создаётся ключ из символов длинной с этот текст, далее идёт шифрование с помощью XOR, и всё это добро нужно записать в файл)
FastDead2 вне форума Ответить с цитированием
Старый 09.05.2009, 18:20   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
нужно чтобы текст из файла записался в массив
Ну тогда создайте массив из блоков, скажем, по 100 символов (или сколько хотите). Заполните его (пример выше). Ну и там дальше по порядку.
fgets тут лучше не использовать.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 09.05.2009, 18:53   #7
FastDead2
Пользователь
 
Аватар для FastDead2
 
Регистрация: 09.05.2009
Сообщений: 12
По умолчанию

2:Sazary
У меня возник такой вопрос, вот я закомпилил ваш пример:

Код:
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int _tmain(int argc, _TCHAR* argv[])
{
FILE *fin,*fout;
size_t k;
char buf[944];

fin = fopen("input.txt","r");
fout= fopen("output.txt","w");

while(!feof(fin))
 {
  k = fread(buf,sizeof(char),944,fin);
  fwrite(buf,sizeof(char),k,fout);
 }

fclose(fin);
fclose(fout);

printf("%s",buf);
getch();
return 0;
}
В файле input.txt, я закинул:
Код:
Mathematische Modelle versuchen, die wesentlichen Parameter von Phдnomenen zu erfassen und diese 
in einem berechenbaren Gleichungssystem, Differentialgleichungssystem o.д. zur Vorhersage des 
beobachteten Systems zu nutzen. Berechenbarkeit meint hier sowohl die analytische Untersuchung als 
auch die Approximation mittels numerischer Verfahren. In der Regel sind auch die sogenannten 
physikalischen Modelle mathematische Modelle, allerdings solche, die sich auf physikalische 
GesetzmдЯigkeiten stьtzen.
Eine wissenschaftliche Untersuchung, die zum Ziel hat, ein System mit Hilfe eines Modells zu 
beschreiben, besteht aus den drei Arbeitsschritten Formulierung, Untersuchung und Validierung des 
Modells. Von einer Simulation spricht man tendenziell dann, wenn das Interesse nicht der Modellbildung 
gilt, sondern ein als valide angenommenes Modell als Hilfsmittel eingesetzt wird, um das modellierte 
System nдher zu untersuchen.
И вот когда вывожу это на экран, в конце какие то не нужные символы, как их убрать?
Изображения
Тип файла: jpg fread.jpg (63.2 Кб, 183 просмотров)
FastDead2 вне форума Ответить с цитированием
Старый 09.05.2009, 18:58   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
И вот когда вывожу это на экран, в конце какие то не нужные символы, как их убрать?
Для моего примера вы неверно выводите.
Вы считываете блоки в цикле. Поэтому там же должны и выводить.
Дальше. Буфер имеет определенный размер. Поэтому и выводится он полностью, до символа конца строки, то есть, нуль-символа.
Если буфер заполняется не полностью, то место конца нужно указать явно:
Код:
#include<stdio.h>
#include <conio.h>

int main()
{
FILE *fin,*fout;
size_t k;
char buf[100];

fin = fopen("input.txt","r");
fout= fopen("output.txt","w");

while(!feof(fin))
 {
  k = fread(buf,sizeof(char),100,fin);
  fwrite(buf,sizeof(char),k,fout);
  buf[k]=0;  
  printf("%s",buf);
 }

fclose(fin);
fclose(fout);

getch();
return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 09.05.2009, 20:41   #9
FastDead2
Пользователь
 
Аватар для FastDead2
 
Регистрация: 09.05.2009
Сообщений: 12
По умолчанию

2:Sazary
Мне снова нужна помощь. Вот чтение из файла и запись его содержимого в массив проходит как нужно.
Но вот создание ключа проходит не корректно: длинна ключ должна быть равна длинне текста(текст берётся тот, что в посте №3 и №7) из файла, но ключ значительно короче, как его удлиннить?)) И корректно записать в файл?)
Код:

#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{ int i,len,n; 
  char naz[20]; 
  char nazv[20]; 

  printf("Please use English letters!!!\n");
// текст из файла для шифрования
printf("\nThe initial text: \n");
FILE *x;
size_t k;
char ooStr[944];

x = fopen("qw.txt","r");

while(!feof(x))
 {
  k = fread(ooStr,sizeof(char),944,x);
  ooStr[k]=0;
  printf("%s",ooStr);
 }
fclose(x);

   len = strlen(ooStr);
   printf("\n%d\n", len);
   char *oStr = new char[len]; 
   char *key = new char[len];  
   char *shStr = new char[len];  

   for(i=0;i<=len;i++)
   oStr[i]=ooStr[i];
    printf("\n\n"); 

// определяем ключ случайным образом
   printf("\nKey:  \n");
   for(i = 0; i<=len; i++)
   key[i]=(char)rand()%255;
   printf("%s", key);
   printf("\n\n");
// записываем ключ в файл
   	FILE *y;
	printf("Please, enter a name of a file for a key: ");
	scanf("%s",naz);
    if ((y=fopen(naz,"w"))==NULL)
    {printf(" Owibka otkritija fajla!!!");
    getch();}
	else
	{fputs(key,y);
	}
	fclose(y); 
	printf("The file is written down...\n");

//собственно само шифрование
   for(i = 0; i<=len; i++)
      shStr[i]=oStr[i]^key[i];

    printf("\nThe ciphered text: %s", shStr);

// записываем зашифрованный текст в файл 
    FILE *t;
	printf("\n\nPlease, enter a name of a file for the ciphered text: ");
	scanf("%s",nazv);
    if ((t=fopen(nazv,"w"))==NULL)
    {printf(" Owibka otkritija fajla!!!");
    getch();}
	else
	{
	fputs(shStr,t);
	}
	fclose(t); 
	printf("The file is written down...\n");
	printf("\nPress any key...");


    _getch();
	return 0;

}
FastDead2 вне форума Ответить с цитированием
Старый 09.05.2009, 21:04   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Уфф... Тут долго разбираться )
Давайте локализуем проблему. Что у вас там, длина ключа маленькая?
Вот, что вижу:
Код:
len = strlen(ooStr);
Это вы ее определяете? Неверно! Вы определяете размер последнего прочитанного блока.
Вычислять длину нужно на стадии чтения:
Код:
len = 0;
while(!feof(x))
 {
  k = fread(ooStr,sizeof(char),944,x);
  ooStr[k]=0;
  len += k;
  printf("%s",ooStr);
 }
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение>сортировка>запись theFEAR Помощь студентам 1 22.04.2009 09:33
Запись/чтение из файла (С++) alexov Общие вопросы C/C++ 15 18.01.2009 17:35
Запись в файл и чтение из него. Swool Общие вопросы C/C++ 8 26.08.2008 16:39
Запись и чтение файла... Altera Общие вопросы Delphi 5 06.05.2008 20:22