2015-08-30 3 views
-1

У меня есть документ с некоторым номером телефона и andresses. Теперь я попытаюсь скопировать числа в одной части структуры и адреса в другую. На данный момент я был просто в состоянии получить данные документа, но я не могу поставить его в моей структуры, пожалуйста, помогите мнеКак отрезать строку в C

C код

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
#include <string.h> 

struct telefon{ 
    char nummer[16]; 
    char adresse[128]; 
}; 

typedef struct telefon TELEFON; 

void main() 
{ 
    TELEFON tel; 
    char buffer[256]; 
    FILE *fp; 
    int i = 0; 
    int countSemi = 0; 

    fp = fopen("Telefondatei.txt", "r"); 

    if(fp == NULL) 
    { 
     printf("Datei konnte nicht geoeffnet werden.\n"); 
    } 
    else{ 

     while(fgets(buffer,1000,fp) != 0){ 
      //printf("%s\n",buffer); 
      while(buffer != 0){ 
       i++; 
       if(buffer[i] == ';'){ 
        countSemi++; 
       } 
       while(countSemi <= 7){ 
        strcpy(tel.adresse,buffer); 
        printf("%s\n %d \n",tel.adresse,countSemi); 
       } 
      } 
     } 
    } 
} 

Пример для данных в моем .txt документе

"Фирма"; ""; "Auto GmbH", "Гассе 3", "5000", "ПН"; ""; "0456", "45652" "Фирма"; "";» ADAC ";" ";" 50000 ";" Mon ";"; "2156"; "545218"

+3

1) Если буфер 256 байт, почему вы хотите прочитать 1000 в 'fgets () '? 2) Почему буфер должен стать NULL в следующем цикле while? - В конце концов вы хотите снова прочитать документы для 'fgets()'? –

+0

вы полны с 1000 байтами, которые просто бесполезны. Мой учитель объяснил нам, когда документ заканчивается, а fgets возвращает null – alovaros

+0

Какие поля в вашем файле с разделителями разделенных точкой соответствуют номеру телефона и по адресу? Вы ожидаете сохранить точки с запятой между разделами адреса? Если нет, что вам нужно - новые линии, пробелы, что-то еще? Обратите внимание, что 'main()' обычно должен возвращать 'int' - см. [Что должно быть' main() 'return in C и C++?] (Http://stackoverflow.com/questions/204476/what-should-main- return-in-c-and-c/18721336 # 18721336). –

ответ

1

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

Предполагаемый формат данных для каждой линии:

Адрес; телефон Номер;

#include <string.h> 
.. 
char * value; 
while(fgets(buffer,256,fp) != 0) 
{ 
    value = strtok(buffer, ";"); // get address 
    strcpy(tel.adresse, value); 

    value = strtok(NULL, ";"); // get number 
    strcpy(tel.nummer, value); 

} 

Кроме этого:

while(buffer != 0) 

в вашем коде не имеет смысла. Вряд ли buffer будет 0. Это массив и значение buffer всегда будет адресом памяти, где начинается этот массив. Вы не можете назначить buffer.

Другой номер post об использовании strtok.

+0

hmm jeah, это хорошая первая часть, но я не могу изменить формат: D, если бы у нас просто был бы адрес и номер, это было бы легко – alovaros

+0

@alovaros: возможно, вы можете применить этот подход к своему делу. –

+0

Ваш предполагаемый формат выглядит немного странным. Для данных образца нет номера телефона в любой строке. Конечно, нам не сказали, где находится номер телефона. Если бы мне пришлось угадать, это две последние колонки. Но мы не знаем. –

-2

Чтобы получить использование данных: fscanf(fp, "%s %s %s %d", str1, str2, str3, &number); или вы можете использовать getc, чтобы получить один символ, но и нужно, чтобы протестировать EOF

+0

Как это поможет? Первая строка данных заполнила бы 'str1' и' str2' и оставила бы остальные неустановленными. На второй строке данных 'str2' также не будет установлен. –

+0

Нет, просто поместите его в цикл, курсор будет на следующей строке данных. – cip

+0

Прошу прощения, но это просто глупость. Мой MCVE: '#include ' и 'int main (void) {FILE * fp = stdin; char str1 [80]; char str2 [80]; char str3 [80]; int number; int line = 0; int rc; while ((rc = fscanf (fp, "% s% s% s% d", str1, str2, str3, & number))> 0) {printf ("Линия% d: поля =% d \ n", ++ line, rc); if (rc> = 1) printf ("str1 = [[% s]] \ n", str1); if (rc> = 2) printf ("str2 = [[% s]] \ n", str2); if (rc> = 3) printf ("str3 = [[% s]] \ n", str3); if (rc> = 4) printf ("number = [[% d]] \ n", number); } return 0; } 'распространяется на 29 строк в моем коде. –

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