2015-04-19 3 views
1

Im пытается прочитать файл с 10 строк, который выглядит как:Распечатка массив строк в C

000000 52.3 65.2 98.7 96.3 100.0 25.0 95.6 98.7 82.5 63.1 
111111 81.0 68.6 54.2 96.3 74.2 78.6 98.5 62.1 64.7 75.0 
222222 52.6 63.5 25.4 42.6 32.0 22.1 52.3 96.6 98.5 63.2 
333333 98.2 65.3 65.4 93.5 32.6 37.5 63.5 91.0 96.3 82.5 
444444 96.3 85.2 74.1 36.9 25.8 14.7 12.3 13.4 63.5 98.4 
555555 93.6 82.5 74.1 63.1 65.2 63.5 98.7 63.2 63.8 64.0 
666666 95.2 61.5 97.8 52.3 63.3 33.3 44.4 55.5 66.6 77.7 
777777 11.1 22.2 33.3 44.4 55.5 66.6 77.7 88.8 99.9 100.0 
888888 12.3 23.4 34.5 45.6 56.7 67.8 78.9 89.1 91.1 98.1 
999999 98.7 87.6 76.5 65.4 54.3 43.2 32.1 21.0 52.9 87.1 

мне нужно прочитать файл построчно в строку так, в настоящее время у меня есть:

#include<stdio.h> 

int main() 
{ 
    FILE *p; 
    char *line[10], *buffer; //Array of strings and a buffer string 
    int a; 
    p = fopen("assign6.dat", "r+"); 
    for(a = 0; a < 10; a++) { 
     fscanf(p, "%[^\n]", buffer); //Read until we reach a newline 
     fgetc(p); //Read the newline 
     line[a] = buffer; 
     printf("%s\n", line[a]); 
    } 
    for(a = 0; a < 10; a++) { 
     printf("%s\n", line[a]); 
    } 
    fclose(p); 
    return 0; 
} 

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

ответ

3

Копирование строки

Вам нужно будет изменить:

line[a] = buffer; 

к этому:

strcpy(line[a], buffer); 

и он будет работать. Причина в том, что line[a] и buffer являются указателями, и, делая их равными, вы в конечном итоге указываете на тот же адрес в памяти.

What is strcpy?

Whis is this the case?

выделения памяти

Вам нужно выделить память для ваших строк, но вы еще не сделали этого.

Судя из файла, Changin это:

char *line[10], *buffer; 

к этому

char line[10][129], buffer[129]; 

является быстрым решением. Я выделяю 129 символов, потому что строка файла имеет максимальную длину 6, и нам нужно еще одно пространство для null character. Вы можете изменить это, как вам угодно. В противном случае вам может потребоваться динамическое выделение памяти.

How to dynamically allocate memory using malloc

+0

может потребоваться выделение для 'line [a]' слишком – Arun

+0

Я отредактировал мое сообщение, спасибо. – nikaltipar

+0

Не хотел бы, чтобы массив был символьной линией [10] [128] вместо того, что вы сказали, потому что 7 недостаточно для чтения всей строки – JackV

1

Поскольку буфер представляет собой указатель на память. Строка, на которую указывает буфер, записывается каждый раз, когда выполняется fscan(), а строка [a] имеет значение указателя буфера, поэтому все они указывают на одну и ту же позицию памяти. В этом положении сохраняется только последняя строка.

Вы должны хранить каждую линию, например с помощью

strcpy(line[a], buffer); // Instead of line[a] = buffer; 
1

Две проблем:

Никакой памяти, выделенной для buffer.

fscanf(p, "%[^\n]", buffer); 

Памяти не выделена line[a]

line[a] = buffer; 

Это может быть удобно использовать заранее выделенный буфер для чтения из файла и строк для дальнейшего копирования.

enum {MaxLineLength = 128}; 
char buffer[MaxLineLength]; 

string line[10]; 

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

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