2015-07-05 4 views
0

новичок в C и попытка чтения в текстовом файле «запасы», разделенные вертикальной линией '|' персонажи. Цель, чтобы открыть файл, который имеет значение строки и поплавок на каждой строке, в следующем формате:C чтение из вертикального символа с разделителем строк

TOM|149.62 
JIM|23.25 

Я прочитал другие сообщения о запятые, двоеточия и разделяющими символами табуляции, но «набор сканируемых символов» предложение применяется здесь как [^|] между %s и %f, похоже, не работает. Кажется, мне удалось сохранить первый символ строки, по крайней мере, сейчас, но сохраненное значение поплавка является бессмысленным. Это позже будет записываться в массивы, объявленные после файла, но основной пример отображения строки и значения плавающего числа для каждой строки означает, что я могу продолжать самостоятельно. Цените любую помощь, которую вы можете мне дать.

#include <iostream> 
#include<stdlib.h> 
#include<stdio.h> 
using namespace std; 

// TOM|149.62 
// JIM|23.25 


int main() 
{ 
    FILE *stocks; 

    char *stock_Tickers[100]; 
    float stock_Prices[100]; 

    if ((stocks = fopen("Stocks.txt", "r")) == NULL) 
    { 
     fprintf(stderr, "Error opening file.\n"); 
     exit(1); 
    } 

    char tempchar; 
    float tempfloat; 

    for (int i = 0; i < sizeof (stock_Tickers); i++) 
    { 
     if (feof(stocks)) 
     { 
      break; 
     } 
     fscanf(stocks, "%s[^|]%f\n",&tempchar,&tempfloat); 
     cout << tempchar << " " << tempfloat; 
     cin.get(); 
    } 
    return 0; 
} 

Обновление: @Michel Billaud Извините, но у меня есть одна последняя ошибка здесь. Ваш метод работал отлично, но когда я пытаюсь использовать этот небольшой вариант, он начинает печатать мусор на последней плавающей точке и разбивается на последующие петли. Посмотрел на локальные переменные, и последний массив просто не обновляется. Я думаю, что это связано с новой строкой, так как когда я изменяю float для целого числа, он все еще не работает. Можете ли вы понять, что я могу делать неправильно, поскольку мне кажется, что тот же формат? Формат на этот раз Ryan|B|IBM|100|176.10. После этого все файлы читаются ... Спасибо.

FILE *trades; 
    // Ryan|B|IBM|100|176.10  
    // Ryan|S|IBM|50|177.10 

    char trade_User[100][20]; 
    char trade_Type[100]; 
    char trade_Tickers[100][4]; 
    int trade_Quantity[100]; 
    float trade_Prices[100]; 
    int trade_Count = 0; 

    if ((trades = fopen("Trades.txt","r")) == NULL) 
    { 
     fprintf(stderr, "Error opening file.\n"); 
     exit(1); 
    } 

    for (int i = 0; i < sizeof(trade_Tickers); i++) 
    { 
     if (feof(trades)) 
     { 
      break; 
     } 
    fscanf(trades, "%19[^|]|%1[^|]|%4[^|]|%d[^|]|%f\n", 
     &trade_User[i], &trade_Type[i], &trade_Tickers[i], &trade_Quantity[i], &trade_Prices[i]); 
    printf("%s %c %s %d %f\n", 
     trade_User[i], trade_Type[i], trade_Tickers[i], trade_Quantity[i], trade_Prices[i]); 
    trade_Count++; 
} 
+1

'char tempchar;' -> 'char tempchar [32];' .. 'fscanf (запасы,% 31 [^ |] |% f \ n", tempchar и tempfloat); ' – BLUEPIXY

+0

C или C++ ? Вы говорите C, но ваш код явно находится на C++. –

+0

Кроме того, в C++ вы должны использовать '' и' '. Заголовки, которые вы используете, предназначены только для C. –

ответ

1

Подсказка: при попытке использовать проблемную функцию, сделать это в небольшой отдельной программе. Таким образом, вы не будете рисковать делать неправильные выводы из-за другой несвязанной проблемы.

// just playing with |-separated fields 

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    char line[]="TOM|1234.56"; 
    char name[20]; 
    float value; 
    sscanf(line, "%[^|]|%f", name, &value); 
    printf("name = %s, value = %f\n", name, value); 
    return 0; 
} 

Кстати: кажется, что вы используете ++ компилятор C (из-за «помощью патезрасе»).

+0

Спасибо, имейте в виду. Удержал std в моей первой тестовой тестовой программе Visual Studio, которая была C++ и скопирована. Спасибо за указание. – Rysz