2016-08-17 4 views
-3

파일에서 배열로 데이터를 저장하려고하지만 현재 행운이 없습니다. 파일을 숫자로 읽은 후에 데이터를 저장 한 후에는 데이터를 쉽게 저장할 수 있습니다. 예를 들어 문자열을 저장하려고하는 경우 프로그램이 계속 충돌합니다. 나는 fscanf()를 사용하고있다. 기능은 전체 .txt 파일이 "성, 이름"과 같은 형식으로 작성되기 때문에 작동합니다. 이제 다음과 같이 for 루프를 사용해 보았습니다.파일 내부의 문자열 처리

char *firstName = (char*)malloc(sizeof(char)*10240); 
char *lastName = (char*)malloc(sizeof(char)*10240); 
for(int i = 0; i<10; i++){ 
    fscanf(fp, "%s %s", firstName[i],lastName[i]); 
} 

그리고 그 곳은 충돌합니다.

+2

가 하나 개의 언어를 선택 표준 입력에서 읽기 전체 C++ 예를

. – chux

+0

디버깅 도움말을 찾는 질문 ("이 코드가 작동하지 않는 이유는 무엇입니까?")에는 원하는 동작, 특정 문제 또는 오류 및 질문 자체에서이를 재현하는 데 필요한 가장 짧은 코드가 포함되어야합니다. 분명한 문제 성명이없는 질문은 다른 독자에게 유용하지 않습니다. See : 최소한의 완전하고 검증 가능한 예제를 만드는 방법. – Olaf

+0

C와 비슷하지만 실제로 C++ 인 경우 fstream 사용을 고려하십시오. – alexeykuzmin0

답변

-1

코드의 오류 : firstName [i]은 (는) 문자열이 아니지만 % c 대신 % s을 (를) 사용하여 문자열처럼 사용합니다.

char * 대신 char **를 사용해야합니다.

char ** firstName = (char **) malloc (10 * sizeof (char) * 10240);

나는 10240이 firstName에 너무 많이 있다고 생각합니다. 255 이하를 사용하십시오.

+0

아주 잘 작동하지 않을 것입니다. 102400 바이트의 단일 연속 배열은 10 개의 문자열 포인터의 배열과 동일하지 않습니다. –

+0

인덱스 대신 오프셋을 사용하면 동의합니다. 이 경우 firstName + offset은 firstname [i]가 아닌 다음과 같이 액세스해야합니다. – madago

+0

오프셋은 문자열을 읽는만큼 업데이트됩니다. – madago

2

순수 C 코드 :

먼저 배열의 배열을 할당 할 필요가

, 다음 하나 그것은 큰 크기의 임시 문자열로 문자열을 검색하는 것이 가장 좋습니다 각 문자열 하나를 할당하고, 나중에 문자열을 중복. 이 (물론, 또는 C99되지 않음) C 준수하는 것이 아니라 C++을 준수하지 않기 때문에 내가 for (ifor (int i을 변경 한

int i,nb_names = 10; 
char **firstName = malloc(sizeof *firstName * nb_names); 
char **lastName = malloc(sizeof *lastName *nb_names); 
char tempn[1000],templ[1000]; 
for(i = 0; i<nb_names; i++){ 
    fscanf(fp,"%s %s", tempn,templ); 
    firstName[i] = strdup(tempn); 
    lastName[i] = strdup(templ); 

} 

참고. C++의 경우 mallocs를 삭제하고 대신 std::vectorstd:string을 사용하십시오.

가능한 경우 C++을 사용하는 것이 좋습니다. 나는 2D 배열을 적절히 할당하려고 시도하는 (실패한) 5 분 전에 나를 포함하여 많은 C/C++ 질문에 대답했다. C++ 라이브러리 코드를 사용하는 C++은 훨씬 더 명확합니다. C 또는 C++ :

#include <vector> 
#include <string> 
#include <iostream> 

using namespace std; 

int main() 
{ 
int nb_names = 10; 
vector<string > firstName(nb_names); 
vector<string > lastName(nb_names); 

for(int i = 0; i<nb_names; i++){ 

    cin >> firstName[i]; 
    cin >> lastName[i]; 

} 
return 0; 
} 
+0

오른쪽! (그것은 일했다. 그러나 나는 행운이 있었다). 결정된. –

+0

코딩 오류를 방지하려면'char ** firstName = malloc (sizeof * firstName * nb_names); '을 제안하십시오. – chux

+0

이 (가) 편집되었습니다. 관심을 가져 주셔서 감사합니다. –