c

Czytanie znaków z pliku i przechowywanie ich w zmiennej w C


Próbuję czytać znak po znaku z pliku i przechowywać znaki w zmiennej.
Wymagana jest tylko zawartość pierwszej linii pliku, więc używam
\ n
lub
EOF
, aby zatrzymać czytanie. Wymagane jest również przechowywanie
SPACE
.
Oto mój program:
#include<stdio.h>
#include<string.h>void main()
{
FILE *fp;
char ch;
char txt[30];
int len;
fp=fopen("~/hello.txt","r");
ch=fgetc(fp);
while(ch != EOF || ch!="\n")
{
txt[len]=ch;
len++;
ch=fgetc(fp);
}
puts(txt);
}

Ale pojawia się ostrzeżenie w czasie kompilacji, takie jak porównanie wskaźnika i liczby całkowitej. Kiedy go uruchamiam, pojawia się błąd segmentacji.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Porównujesz do niewłaściwej rzeczy. Próbować:
ch != '\n'
^ ^

Ponadto, jak widać z innych odpowiedzi, używasz
len
bez inicjalizacji.
Wreszcie zdajesz sobie sprawę, że
fgets
może to zrobić. Możesz przepisać to na:
if (fgets(txt, sizeof txt, fp))
...
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

1)
len
nie jest uruchamiany
int len=0;

2) z

fgetc()
http://cplusplus.com/reference/cstdio/fgetc/
strony:
int fgetc ( FILE * stream );

zatem
fgetc ()
zwraca
int
, a nie
char
, więc musisz zdefiniować
ch
jako
int 
int ch;

3) Dodatkowo


do
cnicutar zauważa, że ​​warunek
while
należy przetestować za pomocą
& amp; & amp;
, a nie
||
:
while(ch != EOF && ch!='\n')

4) po zakończeniu odczytu z pliku należy dodać znak terminatora o wartości null na końcu bufora
txt
.
Dodaj tę linię po pętli
while
txt[len]='\0';


BTW

możesz przeczytać pierwszą linię za pomocą
fscanf ()
, jest to łatwiejsze. Po prostu użyj poniższego kodu
fscanf(fp, "%29[^\n]", txt);

„% [^ \ n]”
oznacza, że ​​
fscanf
odczyta wszystkie znaki z
fp
z wyjątkiem
„\ n”
i przestanie czytać, jeśli otrzyma ten znak. W ten sposób
fscanf
odczyta wszystkie znaki z
fp
, aż znajdzie znak
'\ n'
i zapisze je w buforze
txt
z zerowym terminatorem na końcu. [/code]
"% 29 [^ \ n]"
oznacza, że ​​
fscanf
odczyta wszystkie znaki z
fp
, dopóki nie znajdzie znaku
'\ n'
lub aż osiągnie 29 odczytanych znaków i zapisuje je w buforze
txt
z zakończeniem zerowym na końcu.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

len
nie jest zainicjowany, więc prawdopodobnie próbujesz pisać daleko poza końcem
txt
. Poprawka jest prosta - podczas deklarowania zainicjuj ją na
0
int len = 0;

Oprócz błędu wskazanego przez cnicutar, powinieneś także sprawdzić wartość zwracaną z
fopen
przed użyciem
fp
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

#include<stdio.h>
#include<string.h>void main()
{
FILE *fp;
char ch;
char txt[30];
int len = 0;
fp=fopen("~/hello.txt","r");
if(!fp) {
printf("Cannot open file!\n");
return;
}
ch=fgetc(fp);
while(ch != EOF && ch!= '\n' && len < 30)
{
txt[len] = ch;
len++;
ch=fgetc(fp);
}
txt[len] = 0;
puts(txt);
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Ten program może pomóc w rozwiązaniu problemu.
#include<stdio.h> int main()
{
FILE *fp;
int ch;
char txt[300];
int len=0;
fp=fopen("tenlines.txt","r"); do{
ch=fgetc(fp);
txt[len]=ch;
len++;
} while(ch!=EOF && ch!='\n');
fclose(fp);
puts(txt); return 0;
}

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się