2013-09-23 4 views
2

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

Я пытаюсь написать программу, которая читает файл, который я получил. Но у меня есть поиск слова, а затем сохраните слово после него в массив. То, что я имею сейчас, это

for(x=0;x<=256;x++){ 
fscanf(file,"input %s",insouts[x][0]); 
} 

В файле есть строки, которые говорят «вход A0;» и я хочу, чтобы он сохранил «A0» для инсайтов [x] [0]. 256 - это просто номер, который я выбрал, потому что я не знаю, сколько в нем может иметься в текстовом файле.

меня insouts объявлен:

char * insouts[256][2]; 
+0

В чем проблема? Что не работает? –

+0

он не сохранит «A0» в массиве или, по крайней мере, это то, что я получаю, что он делает, когда я пытаюсь распечатать его. Я просто выдаю кучу нечетных символов – TylerM

+0

Проверьте возвращаемое значение из 'fscanf()'. Для вашего формата он вернет 1, когда он будет успешным, и 0 или -1 в противном случае. Данные должны состоять из чередующихся 'input' и' value' (где значения могут изменять орфографию, но входы не могут). Между ними должны быть пробелы. Я бы поставил пробел в начале строки формата, чтобы пропустить ведущее белое пространство ('' input% s "'). Если ваши данные не отформатированы, вам, вероятно, нужно будет использовать 'fgets()', а затем 'sscanf()' вместо 'fscanf()'. Я бы хотел, чтобы 'fscanf()' был проще в использовании, и, следовательно, легче преподавать; это минный пол или ловушки для новичков. –

ответ

0

Использование fgets() & sscanf(). Отдельный ввод-вывод от сканирования формата.

#define N (256) 
char insouts[N][2+1]; // note: no * and 2nd dimension is 3 
for(size_t x = 0; x < N; x++){ 
    char buf[100]; 
    if (fgets(buf, sizeof buf, stdin) == NULL) { 
    break; // I/O error or EOF 
    } 
    int n = 0; 
    // 2 this is the max length of characters for insouts[x]. A \0 is appended. 
    // [A-Za-z0-9] this is the set of legitimate characters for insouts 
    // %n record the offset of the scanning up to that point. 
    int result = sscanf(buf, "input %2[A-Za-z0-9]; %n", insouts[x], &n); 
    if ((result != 1) || (buf[n] != '\0')) { 
     ; // format error 
    } 
} 
0

Вы хотите передать адрес x'th элемента массива, а не значение, которое хранится там. Для этого вы можете использовать адрес-оператора &.

Я думаю

for(x = 0;x < 256; x++){ 
    fscanf(file,"input %s", &insouts[x][0]); 
    // you could use insouts[x], which should be equivalent to &insouts[x][0] 
} 

будет делать трюк :)

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

char * insouts[256][3]; 

Однако, я довольно уверен, что% s будет соответствовать A0; и не только A0, так что вы могли бы необходимо учитывать и это. Вы можете использовать% c вместе с шириной для чтения заданного количества символов. Однако вы добавляете для добавления нулевого байта самостоятельно. Это должно работать (не проверено):

char* insouts[256][3]; 
for(x = 0; x < 256; x++) { 
    fscanf(file, "input %2c;", insouts[x]); 
    insouts[x][2] = '\0'; 
} 
+0

Хорошо, я пробовал это, но когда я пытаюсь распечатать его, кажется, что я просто получаю случайные буквы. printf ("% («% c», выходы [x] [2]); – TylerM

+0

Hm, take посмотрите на мое редактирование и посмотрите, работает ли это. Кстати, используйте printf («% s \ n», insouts [x]); печатать. –

+0

Нет, все еще не работает. Просто случайные буквы. В файле: вход A0; вход A1; вход A2; вход A3; вход B0; вход B1; вход B2; вход B3; выход GT; выход LT; Итак, если я следую за вами правильно, он должен распечатывать список входов правильно? – TylerM

0

Вместо того, чтобы использовать fscanf, почему бы вам не использовать «getdelim» с «;» как разделитель. Согласно справочной странице

«getdelim() работает как getline(), за исключением того, что в качестве аргумента разделителя может быть указан разделитель строк, отличный от новой строки. Как и в случае с getline(), символ разделителя не добавляется, если один не присутствовал во вводе до того, как был достигнут конец файла ».

Таким образом, вы можете сделать что-то вроде (непроверенной и неоткомпилированной код)

char *line = NULL; 
size_t n, read; 
int alloc = 100; 
int lc = 0; 
char ** buff = calloc(alloc, sizeof(char *)); // since you don't know the file size have 100 buffer and realloc if you need more 
FILE *fp = fopen("FILE TO BE READ ", "r"); 
int deli = (int)';'; 
while ((read = getline(&line, &n, fp)) != -1) { 
    printf("%s", line); // This should have "input A0;" 
    // you can use either sscanf or strtok here and get A0 out 
    char *out = null ; 
    sscanf(line, "input %s;", &out); 
    if (lc > alloc) { 
     alloc = alloc + 50; 
     buff = (char **) realloc(buff, sizeof(char *) * alloc); 
    } 
    buff[lc++] = out 
} 

int i = 0 ; 
for (i = 0 ; i < lc; i++) 
    printf ("%s\n", buff[i]); 
+0

Я уверен, что работает и благодарю вы за помощь, но я не особенно понимаю некоторые из них. Я знаю, что мы не получили выделение в классе, потому что он сказал, что мы скоро начнем. – TylerM

Смежные вопросы