Czytanie pliku C

0
#include <locale.h>
#include <stdio.h>
#include <wchar.h>
#include <stdlib.h>

void przesun(wchar_t buf[],int size, int val)//bez WEOF
{
	for(int i=0;i<size-1;i++)
		buf[i]+=val;
}
int wczytaj_buf(FILE *input, wchar_t buf[], int chunk_size)
{
	int size=0;
	for(int i=0;i<1000000;i++)//wczytaj do bufora
	{
		buf[i]=fgetwc(input);
		size++;
		if(buf[i]==WEOF)
			break;
	}
	return size;
}

void wypisz_stdout(wchar_t buf[],int size)
{
	for(int i=0;i<size;i++)//czytaj z bufora
	{
		wprintf(L"%lc:",buf[i]);
		wprintf(L"%d ",buf[i]);
	}
}

void wypisz_plik(FILE *output, wchar_t buf[],int size)
{
	for(int i=0;i<size;i++)//czytaj z bufora
	{
		fwprintf(output, L"%lc:",buf[i]);
		fwprintf(output, L"%d ",buf[i]);
	}
}
int poczatek(FILE *input, FILE *output)
{

		
	return 1;
}

void koniec(FILE *input, FILE *output)
{
	freopen ("/dev/tty", "a", stdout);
	printf("\n");
	fclose(input);
	fclose(output);
}

int main()
{

	FILE *input;
	FILE *output;	
	wchar_t buf[1000000];	
	
		setlocale(LC_ALL,"pl_PL.UTF8");
	if((input = fopen("wej","r")) == NULL)
		return 0;
		
	if((output = fopen("wyj","w")) == NULL)
		return 0;
	int size=0;
	
	for(int j=0;j<1;j++)//parser
	{
		size=wczytaj_buf(input,buf,10000);
		przesun(buf,size,0);
		wypisz_stdout(buf,size);
		wypisz_plik(output,buf,size);
		
	}
	
	koniec(input, output);

	return 1;
}
#include <locale.h>
#include <stdio.h>
#include <wchar.h>
#include <stdlib.h>

void przesun(wchar_t buf[],int size, int val)//bez WEOF
{
	for(int i=0;i<size-1;i++)
		buf[i]+=val;
}
int wczytaj_buf(FILE *input, wchar_t buf[], int chunk_size)
{
	int size=0;
	for(int i=0;i<1000000;i++)//wczytaj do bufora
	{
		buf[i]=fgetwc(input);
		size++;
		if(buf[i]==WEOF)
			break;
	}
	return size;
}

void wypisz_stdout(wchar_t buf[],int size)
{
	for(int i=0;i<size;i++)//czytaj z bufora
	{
		wprintf(L"%lc:",buf[i]);
		wprintf(L"%d ",buf[i]);
	}
}

void wypisz_plik(FILE *output, wchar_t buf[],int size)
{
	for(int i=0;i<size;i++)//czytaj z bufora
	{
		fwprintf(output, L"%lc:",buf[i]);
		fwprintf(output, L"%d ",buf[i]);
	}
}
int poczatek(FILE *input, FILE *output)
{
	setlocale(LC_ALL,"pl_PL.UTF8");
	if((input = fopen("wej","r")) == NULL)
		return 0;
		
	if((output = fopen("wyj","w")) == NULL)
		return 0;
		
	return 1;
}

void koniec(FILE *input, FILE *output)
{
	freopen ("/dev/tty", "a", stdout);
	printf("\n");
	fclose(input);
	fclose(output);
}



int main()
{

	FILE *input;
	FILE *output;	
	wchar_t buf[1000000];	
	
	poczatek(input, output);
	int size=0;
	
	for(int j=0;j<1;j++)//parser
	{
		size=wczytaj_buf(input,buf,10000);
		przesun(buf,size,0);
		wypisz_stdout(buf,size);
		wypisz_plik(output,buf,size);
		
	}
	
	koniec(input, output);

	return 1;
}

Mógłby ktoś miły wytłumaczyć dlaczego kod u góry działa, podczas gdy kod na dole nie działa, w sensie kompilator ostrzega:

czytaj.c: In function ‘main’:
czytaj.c:70:2: warning: ‘input’ is used uninitialized in this function [-Wuninitialized]
  poczatek(input, output);
  ^~~~~~~~~~~~~~~~~~~~~~~
czytaj.c:70:2: warning: ‘output’ is used uninitialized in this function [-Wuninitialized]

a program przy próbie uruchomienia wysypuje się:

Segmentation fault (core dumped)
3

Musisz jakoś sensowniej zwrócić strumienie input/output.
Obecnie ich nie zwracasz poza poczatek.
Przykład: https://stackoverflow.com/a/37468931

1

Czy to jakaś nowomodna mania pisane rozległych kodów?
Wystarczy tyle:
Pisane bez kompilatora, mogą być drobne pproblemy.

#include <stdio.h>
#include <wchar.h>
#include <stdlib.h>

FILE *ifnull(FILE *fl,FILE *std)
{
	return fl?fl:std;
}

FILE *opn(FILE *std,const wchar_t *name,const wchar_t *mode)
{
	return ifnull(fopenw(name,mode),std);
}

void cls(FILE *fl,FILE *std)
{
	if(fl!=std) fclose(fl);
}

int main()
{
	FILE *filein=opn(stdin,L"in.txt","r");
	FILE *fileout=opn(stdout,L"out.txt","w");
	for(wchar_t ch;(ch=fgetwc(filein))!=WEOF;wprintf(L"%lc:%d ",ch,ch)) {}
	cls(filein,stdin);
	cls(fileout,stdout)
	return 0;
}
3

@Dragon:
Od jakichs 15 lat panuje na pewno moda na nazywanie funkcji pelnymi slowami.

Poza tym o ile "opn" bardzo latwo odcyfrowac, o tyle juz "cls" niekoniecznie.
cls przez dlugi czas bylo glownie kojarzone z DOS-owym "Clear Screen", nie wiem jak teraz sie ludziom kojarzy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1