C언어 파일입출력을 이용할 때, 파일을 한줄씩 읽는 방법이 궁금합니다.
파일에 있는 문자열과 숫자쌍을 출력하는 프로그램인데요
먼저 파일에 있는 데이터를 알려드리면
Poly1 2 10 4 3
Poly2 3 5 6 3 5 8
이렇게입니다.
최종적인 출력은
문자열: Poly1
숫자쌍: 2 10
숫자쌍: 4 3
문자열: Poly2
숫자쌍: 3 5
숫자쌍: 6 3
숫자쌍: 5 8
이렇게입니다. 제가 짜본 코드는 이건데
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
FILE* fp;
char name[100];
int ch, gy;
fp = fopen("data.txt", "r");
while (!feof(fp))
{
fscanf(fp, "%s", name);
printf("문자열:%s\n", name);
fscanf(fp, "%d %d\n", &ch, &gy);
printf("숫자: %d %d\n", ch, gy);
}
}
지금 코드는 문자열 -> 숫자 -> 숫자 -> 문자열 -> 숫자 -> 숫자 이런식으로 파일에서 입력을 받고있는데 제가 원하는건
문자열 -> 숫자 -> 숫자->숫자->숫자(한줄끝)
문자열 -> 숫자 -> 숫자->숫자->숫자->숫자->숫자(한줄끝)
이런 식으로 입력받는건데 어떻게해야할지를 전혀모르겠네요... fgets함수는 한 변수에만 넣는거라 더 어렵네요...
혹시나 질문에서 뭔가 누락된게있으면 말씀해주세요...프로그래밍 질문은 처음이라 잘모를수있습니다 ㅠㅠ
fgets 로 받은 string 을
fgets 로 받은 string 을 tokenizing 하는게 좋을 것 같은데요. tokenizing 은 strsep 사용하시면 되겠고요.
strsep 는 man page 나 google에서 "strsep 예제" 로 찾아 보시면 많이 나옵니다.
뭐 여기 고수분들이 많으니, 다른 간소한 방법을 올려 주실지도..
답변감사합니다
fgets로 받은걸 토큰단위?로 나누어서 하시라는건가용? 한번 찾아보겠습니다! 답변감사드려요
쉽게 말하면 한 라인을 문자열로 받은 다음,
쉽게 말하면 한 라인을 문자열로 받은 다음, 공백문자를 기준으로 잘라서 새로운 배열변수를 만들라는 것이죠.
입력 중에 숫자로 시작하는 문자열이 있나요? (e.g
입력 중에 숫자로 시작하는 문자열이 있나요? (e.g., "1string")
이게 있는지 없는지에 따라 난이도가 조금 차이가 있습니다.
대부분의 프로그래밍 언어가 숫자로 시작하는 identifier를 허용하지 않았던 이유이기도 하죠.
다행히도 없습니다!
문자열중에는 숫자로시작하는 문자열은 없고 num1처럼 섞어쓰는경우는 있습니다!!
대충 짜봤습니다 ^^
대충 짜봤습니다 ^^
우와...
아직 프로그래밍을 잘 몰라서... 굉장히 복잡하네요 @_@ 짜주신코드를 이해하는건 엄청오래걸릴것같지만 감사합니다!
...
이거 flex나 유사품 써서 자동생성된 코드죠? -.-
초보자한테 이런 장난을 치시다니, 나빠요!
코드를 마음으로 읽었어요~
전 왤케 사기꾼님의 코드가 아름답게 보일까요?
페이스북이라면 좋아요를 막 눈지르고 싶네요^^^
[우분투 18.04 파여폭스 나비에서 적었어요~]
파일로부터 값을 읽을 필요가 있을 때 fgets()
파일로부터 값을 읽을 필요가 있을 때 fgets() + sscanf() 조합이 좋더군요.
오 sscanf
fgets은 char형밖에 받을 수 밖에 없어서 어쩌지 고민하고있었는데 sscanf가 있었네요!! 답변감사드려요! 한번 해결해보겠습니다
해결했습니다.
sscanf+fgets로 해결했네요...제가 보기에도 코드가 좀 더럽긴해도...해결했다는거에 의의를 두겠습니다 ㅋㅋ
scanf 류는 신경쓰지 않으면 bof 의 위험이
scanf 류는 신경쓰지 않으면 bof (Boffer overflow) 의 위험이 많기 때문에 잘 쓰셔야 합니다.
https://blog.naver.com/PostView.nhn?blogId=mdstec_auto&logNo=220896135830 또는 검색에서 "scanf 버퍼 오버플로우" 로 검색해 보시면 fscanf 또는 vfscanf 를 사용하라는 글들이 꽤 나옵니다. sscanf 의 경우에는 fsscanf 를 사용하시면 됩니다.
저는 scanf 에 된통 당한 적이 있어, strsep 또는 strtok_r 같은 토큰 함수로 파싱을 해서 많이 사용 합니다.
strtok, atoi
라인을 읽었으면 ' '를 delimiter로 라인을 tokenize 하신 다음, 첫 토큰 외의 모든 토큰은 정수/실수로 변환하면 됩니다.
https://www.tutorialspoint.com/c_standard_library/c_function_strtok.htm
그리고 atoi, atof를 찾아보세요.
라인 읽고 (버퍼 마지막에 남을 수도 있는 newline을 주의하시고), strtok로 토크나이징 하면서, 첫 토큰이 아니면 atoi로 변환하면 됩니다.
댓글 달기