2014-10-27 2 views
-2

Я хочу прочитать из .txt-файла, который содержит английские предложения и хранить их в массиве символов. Каждый символ по характеру. Я попытался, но получил ошибку сегментации: 11. У меня есть проблемы с fscanf и чтение из файла в С.Читайте из .txt-файла и сохраняйте его в массиве. Работа с fscanf

#include<stdio.h> 
#include<math.h> 
#include<limits.h> 
int main() 
{ 
    FILE* fp = fopen("file1.txt","r"); 
    char c , A[INT_MAX]; 
    int x; 
    while(1) 
    { 
     fscanf("fp,%c",&c); 
     if(c == EOF) 
     {break;} 
     A[x] = c; 
     x++; 
    } 
    int i; 
    for (i=0;i<x;i++) 
    printf("%c",A[i]); 
return 0; 
} 
+4

вы можете вставить 'чек NULL' для' 'fp' после fopen'? Кроме того, лучше написать 'int x = 0;' –

+1

Использовать отладчик. –

+3

'A [INT_MAX]' выглядит немного консервативным. Является ли ваш локальный стек таким большим? – usr2564301

ответ

1

Задача 1: Ввод массива в стек, как A[INT_MAX] является плохой практикой; он выделяет необоснованное количество места в стеке (и будет разбиваться на машинах, где INT_MAX большой по отношению к размеру памяти). Получите размер файла, затем malloc место для него.

fseek(fp, SEEK_END); 
long size = ftell(fp); 
rewind(fp); 
char *A = malloc((size_t) size); // assumes size_t and long are the same size 
if (A == NULL) { 
    // handle error 
} 

Задача 2: fscanf неправильно. Если вы настаиваете на использовании fscanf (который не является хорошим способом, чтобы прочитать весь файл, см проблемы 4), вы должны изменить:

fscanf("fp,%c",&c);` 

должен быть

int count = fscanf(fp, "%c",&c); 
if (count <= 0) 
    break; 

Проблема 3: Ваш x счетчик не инициализируется. Если вы настаиваете на использовании fscanf, вы должны инициализировать его:

int x = 0; 

Задача 4: fscanf неправильный путь, чтобы прочитать весь файл. Предполагая, что вы выяснили, как большой файл (см задачу 1), вы должны прочитать файл с fread, как это:

int bytes_read = fread(A, 1, size, fp); 
if (bytes_read < size) { 
    // something went wrong 
} 

Мой первоначальный ответ, и хорошее общее правило:

Вам нужно проверить возвращаемое значение, потому что ваше значение c никогда не может быть EOF, потому что EOF - значение int, которое не соответствует char. (Вы должны всегда проверять возвращаемые значения, даже когда кажется, что ошибки не должно произойти, но я не всегда делал в коде выше.)

От http://www.cplusplus.com/reference/cstdio/fscanf/:

Возвращаемое значение

При успешном выполнении функция возвращает количество успешно заполненных элементов списка аргументов. Этот счетчик может соответствовать ожидаемому количеству элементов или меньше (даже нулю) из-за соответствия сбоя, ошибки чтения или досягаемости конца файла.

Если при чтении происходит ошибка чтения или достигнут конец файла, устанавливается правильный индикатор (feof или ferror). И, если это произойдет до того, как данные будут успешно прочитаны, возвращается EOF.

Если ошибка кодирования происходит при интерпретации широких символов, функция устанавливает errno в EILSEQ.

+0

Это, по нескольким величинам, не единственная проблема с исходным кодом, и изменение именно этого не устранит многочисленные другие проблемы. – usr2564301

+0

Это одна из многих проблем, а не одна из причин, вызвавших ошибку сегментации, но, вероятно, она является наименее видимой для тех, кто не знает, как использовать отладчик. (Это также одна серьезная проблема, о которой еще не упоминалось в то время, когда я ее разместил.) – Steve

+1

ОК, теперь мой ответ охватывает все, а не только проблемы, уже затронутые в ответах, которые присутствовали, когда я отвечал изначально. – Steve

0

Привет, вы должны прояснить, где программа должна читать данные. Вы можете получить доступ ко всем символам, даже если вы читаете строку как строку.

попробовать его

#include<stdio.h> 
#include<string.h> 
#define INT_MAX 100 
int main() 
{ 
FILE* fp = fopen("file1.txt","r"); 
char c , A[INT_MAX]; 
int i; 
int x; 
j=0 
while(fscanf(fp,"%s",A[j])!=EOF) 
{ 
    j++; 
} 
int i; 
int q; 
for(q=0;q<j;q++) 
{ 
    for (i=0;i<strlen(A[q]);i++) 
    printf("%c ",A[q][i]); 
printf("\n"); 
} 
return 0; 
}