2013-03-09 162 views
3

讓說我有一個文件看起來像這樣從文本文件中讀取字符串和整

51.41 52.07 52.01 51.22 50.44 49.97 Coal Diggers 
77.26 78.33 78.29 78.12 77.09 75.74 Airplane Flyers 
31.25 31.44 31.43 31.09 31.01 30.92 Oil Fracting and Pumping 
52.03 12.02 12.04 22.00 31.98 61.97 Big Bank 
44.21 44.32 44.29 43.98 43.82 43.71 Rail Container Shipping 
93.21 93.11 93.02 93.31 92.98 92.89 Gold Bugs 

我想用的fscanf把浮法陣列和字號碼的陣列,以讀取該文件的字字符串。但是,經過幾個小時的艱苦思考,我仍然無法弄清楚如何解決這個問題。

void dataInsert (COMPANY* company1, COMPANY* company2, COMPANY* company3, COMPANY* company4, COMPANY* company5, COMPANY* company6) 
{ 
//Function Declaration 
FILE* spData; 
float number; 
char* name[20]; 

//Statement 
if ((spData = fopen("dataFile","r")) == NULL) 
{ 
    fprintf(stderr, "ERROR OPENING!!"); 
    exit (1); 
} 

int i = 0; 
int numCount = 0; 
int lineCount = 0; 
while (fscanf(spData, "%f", &number) != EOF) 
{ 
    if(isdigit(number)) 
    { 
     if (lineCount == 0) 
     { 
      company1 -> stock_price[i] = number; 
     } 
     else if (lineCount == 1) 
     { 
      company2 -> stock_price[i] = number; 
     } 
     else if (lineCount == 2) 
     { 
      company3 -> stock_price[i] = number; 
     } 
     else if (lineCount == 3) 
     { 
      company4 -> stock_price[i] = number; 
     } 
     else if (lineCount == 4) 
     { 
      company5 -> stock_price[i] = number; 
     } 
     else if (lineCount == 5) 
     { 
      company6 -> stock_price[i] = number; 
     } 

     numCount++; 
     i++; 
     if (numCount == 6) 
     { 
      lineCount++; 
      numCount = 0; 
      i = 0; 
     } 
    } 
}//while 
fclose (spData); 
}//dataInsert 

我不知道如何處理每行末尾的字符串。我想把這些字符串放在結構公司 - >名稱[10]中。這些數據都在一個文本文件中。

+1

您確定要讀出的值作爲_integers_而不是_floating point_?另外,請告訴我們[你曾嘗試](http://mattgemmell.com/2008/12/08/what-have-you-tried/)。 – 2013-03-09 02:02:21

+0

這些實際的'
'標籤在文件中?這是文件的XML或HTML或什麼?也許你應該使用解析庫?如果該文件與您在此顯示的格式完全相同,則可以使用C語言對其進行解析,但腳本語言會更容易一些...... Python將是我的選擇。 – steveha 2013-03-09 02:05:03

+2

你的文件是否總是這樣組織?在字符串之前有相同數量的數字?或者你是否必須檢測你正在閱讀的是數字還是字符串? – 2013-03-09 02:11:14

回答

2

如果文件格式正確,可以輕鬆使用scanf()。這裏有一些代碼讓你開始。我沒有測試過這個,你需要填寫一些缺失的東西。

#include <ctypes.h> // for isspace() 
#include <stdio.h> // for scanf(), getchar(), and EOF 

char c2d[MAX_LINES][MAX_LENGTH_STRING_PER_LINE]; 
char *pstr; 
float f2d[MAX_LINES][6]; // 6 floats per line 
float *p; 
int c, current_line_number; 
char ch; 
FILE *input; 

input = fopen(...); 
if (!input) 
    ... handle the error 

for (current_line_number = 0; ; ++current_line_number) 
{ 
    // handle each line of input 

    // first read 6 float values 
    p = f2d + current_line_number; 
    c = fscanf(input, "%f %f %f %f %f %f", p + 0, p + 1, p + 2, p + 3, p + 4, p + 5); 
    if (c != 6) 
     ... handle the error here 

    // next grab string; stop at '<' or end of line or EOF 
    pstr = c2d + current_line_number; 
    for (;;) 
    { 
     ch = fgetc(input); 
     if (ch == EOF || ch == '<' || ch == '\n') 
     { 
      *pstr = '\0'; 
      break; 
     } 
     *pstr++ = ch; 
    } 
    if (ch == '<') 
    { 
     // char was '<' so throw away rest of input line until end of line 
     for (;;) 
     { 
      if (ch == EOF || ch == '\n') 
       break; 
      ch = fgetc(input); 
     } 
    } 
    for (;;) 
    { 
     // eat up any white space, including blank lines in input file 
     if (ch == EOF || !isspace(ch)) 
      break; 
     ch = fgetc(input); 
    } 
    // once we have hit end of file we are done; break out of loop 
    if (ch == EOF) 
     break; 
} 

fclose(input); 

我沒有使用scanf()閱讀在該行的結束的字符串,因爲它停止,當它擊中的白色空間,和你的字符串值在他們的空間。

如果輸入文件並非總是六個浮點值,則需要編寫代碼以每次調用一個浮點數,直到遇到不會作爲浮點解析的東西,並且您需要花車陣列的寬度足以應付每條線路允許的最大花車數量。

祝你好運。

+0

'fscanf'被用來代替'scanf',對吧?輸入不是來自stdin,而是來自文件。 – uba 2013-03-09 02:30:04

+0

當然,'fgetc()'而不是'getchar()'。我改變了答案。 – steveha 2013-03-09 02:32:03

+0

如果我使用scanf,它是否跳過每行結尾的字符串? – 2013-03-09 02:36:58

4

而不是使用fscanf我會建議使用fgets來獲得該行。然後使用該行上的sscanf來獲取數字值,並搜索第一個字母字符以知道字符串的起始位置(使用例如strspn)。

事情是這樣的:

char line[256]; 

while (fgets(line, sizeof(line), fp) != NULL) 
{ 
    /* Get the numbers */ 
    float numbers[6]; 
    sscanf(line, "%f %f %f %f %f %f", 
     &numbers[0], &numbers[1], &numbers[2], 
     &numbers[3], &numbers[4], &numbers[5]); 

    /* Where do the numbers end... */ 
    size_t numbers_end = strspn(line, "1234567890. \t"); 

    /* And get the name */ 
    char *name = line + numbers_end; 

    /* Do something with the numbers and the name */ 
} 
+0

感謝您的回覆,但不幸的是,我不能使用sscanf,因爲這是學校作業的一部分,所以我必須根據我在課堂上學到的內容來做。 – 2013-03-09 05:29:32

+0

@ProgrammingNerd永遠不要害怕「跳出框框思考」......你可以做兩個解決方案,一個遵循字母_賦值,然後列出可能的缺點,然後列出一個解決方案,但沒有缺點。 – 2013-03-09 15:03:10

+0

@ProgrammingNerd不是我說我的解決方案本身沒有缺點,所有的解決方案都有利弊,包括我的。 – 2013-03-09 15:04:34

相關問題