fgets를 사용하여 파일에서 몇 줄의 텍스트를 읽는 데 문제가 있습니다. 이 파일은 플러그인이 처음 실행될 때 번들 내의 파일에 기록되는 몇 가지 기본 사용자 데이터입니다. 이후에 플러그인을 실행하면 사용자 데이터가 읽혀지고 교차 참조되어 사용자 신원을 확인해야합니다.fgets는 줄의 시작을 읽지 않습니다.
데이터는 항상 3 행이며 frwite로 정확히 쓰여지고 fopen으로 열립니다.
원래 이론은 fgets를 각 행을 3 번 읽는 것을 데이터 구조체의 일부인 자체 char 배열로 호출하는 것이 었습니다. 문제는 첫 번째 라인이 올바르게 읽혀지고, 두 번째 라인은 위치 표시기가 다음 라인에서 시작되지만 라인 1에서 읽힌 문자 수만큼 오프셋 된 것처럼 읽혀집니다. 세 번째 라인은 전혀 읽히지 않습니다.
fgets는 오류를 반환하지 않으며, 그것이 있어야하는 데이터를 읽은 것처럼 행동합니다. 그래서 나는 분명히 뭔가를 놓치고 있습니다.
어쨌든 여기 내 코드의 일부가 있습니다. 누군가 내 실수에 대해 밝힐 수 있습니다! NULL 각 문자열의 마지막 문자를 설정
int length;
fgets(var.n, 128, regFile);
length = strlen(var.n);
var.n[length-1] = NULL;
fgets(var.em, 128, regFile);
length = strlen(var.em);
var.em[length-1] = NULL;
fgets(var.k, 128, regFile);
length = strlen(var.k);
var.k[length-1] = NULL;
fclose(regFile);
단지 제거되는/N
이 코드 시퀀스는 라인 (1)의 전체를, 상기 제 2 행의 절반과 3 행의 없음을 출력한다. 이것에 대한 답에 대한 @alvits에
해당 파일에 적절한 EOL 문자가 있는지 확인 했습니까? dos-text 파일은 유닉스 텍스트 파일이나 mac 텍스트 파일과 같은 것을 읽지 않습니다. –
Note : 어떤 경우에는'strlen (var.n) -> 0'과'var.n [length-1] = anything'이 문제가됩니다. 'fgets()'의 결과를'NULL'에 대해 검사하고'var.n [length-1] = '\ 0''을하기 전에'length> 0'인지 테스트하는 것이 좋습니다. – chux
1)'var.n'의 정의를 보여줍니다. 2) 'var.em [length-1] ='\ 0 ';에서'NULL'대신 '\ 0'을 사용하십시오. – chux