2014-12-30 2 views
-2

파일 (몇 문장의 텍스트)에서 텍스트를 읽고 모든 고유 한 문자를 써야합니다. 그렇게하려면 배열을 사용해야합니다. 나는이 코드를 작성했지만 나에게 아무것도주지 않는다.파일에서 텍스트를 배열로 배열하는 방법

#include <stdio.h> 

int main(void) { 
    int i; 
    FILE *in = fopen("test.txt", "r"); 

    if (in) { 
    char mas[50]; 
    size_t n = 0; 
    int ch; 
    while ((ch = getc(in)) != EOF) { 
     mas[n++] = (char)ch; 
    } 
    fclose(in); 
    } 

    for (i = 0; i < 50; i++) { 
    printf("%c", mas[i]); 
    printf("\n"); 
    } 
    return 0; 
} 
+3

실제로 mas'가'의 printf에 정의되어 있지 않습니다'나타내는 컴파일 오류가 발생한다 'char mas [50]'는'if' 문 블록 내에서만 정의되기 때문에 "% c", mas [i])'명령문을 사용하십시오. – lurker

+0

이 하나가 고정되었습니다. 이제는 약간의 결과물을 보여 주지만, 이해할 수는 없으며 숫자 만 포함하고 텍스트의 문자는 포함하지 않습니다. – rimasbimas

+0

왜냐하면'mas'의 50 가지 요소를 모두 인쇄하기 때문입니다.하지만 파일에서 50 문자를 읽지 못할 수도 있습니다. 나머지'mas' 엔트리는 단지 랜덤 메모리 내용입니다. 읽은 문자 수를 추적하고 그 수만큼만 인쇄하십시오. 예를 들어,'if' 블록 밖에서'size_t n' 선언을 넣으면'n'을 카운트로 사용하고'for (i = 0; i lurker

답변

0

scope에 문제가 있습니다. masif 코드 블록 내에서 선언되었으며 if 블록 외부에서는 공개되지 않습니다. 블록 외부에 mas에 대한 선언을 이동하십시오. 당신은 당신이 less than 50 chars에 읽기를 제한하는 데 실패하고 쉽게 mas을 오버플로 외부뿐만 아니라 즉 :

int i; 
char mas[50]; 
size_t n = 0; 

다음을 n을 유지해야합니다. n에 수표를 추가

while ((ch = getc(in)) != EOF && n < 50) { 

마지막 숫자 문자의 당신의 쓰기를 제한은 n 읽기 :

for(i=0;i<n;i++) 

컴파일 및 실행됩니다. 경고을 사용하도록 컴파일 한 경우 컴파일러에서 scope 문제를 확인했을 수 있습니다. 최소한 -Wall -Wextra으로 컴파일하십시오.

+0

'mas'가'if' 외부에 정의되지 않았기 때문에 컴파일러는 경고없이 해당 코드를 컴파일하지 않습니다. –

+0

That 's what ** 경고가 활성화 된 상태에서 컴파일을했다면 컴파일러가 범위 문제를 확인했을 것입니다. **라고 쓰여 있습니다. 그 중 어떤 부분이 불분명합니까? –

+0

경고를 활성화 할 필요는 없습니다. –

-1

일부 문자의 배열에 읽어 하나의 체크 고유 아래 코드

#include <stdio.h> 

int main(void) 
{ 
    int i,j,flag; 
    char mas[50]; 
    size_t n = 0; 
    FILE *in = fopen("test.txt", "r"); 
    if (in) {  

     int ch; 
     while ((ch = getc(in)) != EOF && n < 50) { 
      mas[n++] = (char)ch; 
     } 
     fclose(in); 
     } 
    for(i=0;i<n;i++)  
    { 
     flag = 0; 
     for(j=i+1;j<n;j++) 
     { 
     if(mas[i] == mas[j]) 
     { 
     flag = 1; 
     break; 
     } 
     } 
     if(!flag) 
     { 
     printf("%c\n",mas[i]); 
     } 
    } 
     return 0; 
} 
을 인쇄하려는 경우
1
//low level input output commands method 

#include <fcntl.h> 

int main() 
{ 
    int x,i,n,v=1; 
    char s[256],str; 

    for (i=1;i<=255;i++) 
     s[i]='0'; 
    x=open("out.txt",O_RDONLY); 

    if (x==-1) 
    { 
     printf("Invalid file path"); 
     return 0; 
    } 

    while (n!=0) 
    { 
     n=read(x,&str,1); 
     s[(int)str]='1'; 
     v=0; 
    } 
    close(x); 

    for (i=1;i<=255;i++) 
     if (s[i]=='1') 
      printf("%c",(char)i); 

    if (v) 
     printf("Blank file!"); 
    close(x); 

    return 0; 
} 
+0

왜'str [1]'??? 'char str;'과'read (x, & str, 1)'을하지 말고, 변수에 대해 의미있는 이름을 사용해야합니다. 또한 코드를 읽을 수 있도록 포맷하고, 나를 믿으십시오. 그렇게하지 않으시면 결코 후회할 수 없습니다. –

+0

또한'open()'의 반환 값을 검사해야합니다. 오류가 발생하면'-1'을 반환합니다. 예를 들어 파일이 없으면 잘못된 파일 설명자에서 읽으려고 시도합니다. –

+0

@iharob 팁 주셔서 감사합니다. – webpersistence

관련 문제