2016-04-21 198 views
0

因此,我有一個包含數據的大文本文件,我想重新排列它。數據每行都有整數和浮點數組合,但我只想抓取第一個整數,它是1或0,並將其放在行尾。從文件中讀取數據C

例如,在我的數據文件,我有以下行
1 0.41 1 44
,我想是
0.41 1 44 1

這是我到目前爲止並不能得到它的工作對。謝謝。

void main() { 
FILE *fp; 
FILE *out; 

char str[15]; 
char temp; 

fp = fopen("dust.txt", "r+"); 
out = fopen("dust.dat", "w"); 

while(fgets(str, sizeof(str), fp) != NULL) { 
    temp = str[0]; 
    str[strlen(str)] = ' '; 
    str[strlen(str)+1] = temp; 
    str[strlen(str)+2] = '\r'; 
    str[strlen(str)+3] = '\n'; 

fwrite(str, 1, strlen(str), out); 
} 

fclose(fp); 
    fclose(out); 
} 
+1

你也可能想檢查由fgets返回的str的大小,因爲你嘗試訪問長度+ 3 – ponayz

+0

不要忽視'fgets'保留的'newline'。 –

回答

4

這將輸出視爲文本文件(與輸入相同),而不是二進制文件。我已經把代碼註釋放在適當的位置。你最嚴重的錯誤是在覆蓋字符串終止符後調用strlen。無論如何只需要調用它一次。

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

int main(void) {       // main must be type int 
    FILE *fp; 
    FILE *out; 
    char str[100];       // be generous 
    size_t len; 

    fp = fopen("dust.txt", "r"); 
    out = fopen("dust2.txt", "w");   // text file 
    if(fp == NULL || out == NULL) 
     return 1; 

    while(fgets(str, sizeof(str)-3, fp) != NULL) { 
     str [ strcspn(str, "\r\n") ] = 0; // remove trailing newline etc 
     len = strlen(str); 
     str[len] = ' ';      // overwrites terminator 
     str[len+1] = str[0];    // move digit from front 
     str[len+2] = 0;      // terminate string 
     fprintf(out, "%s\n", str + 2);  // write as text 
    } 

    fclose(fp); 
    fclose(out); 
    return 0; 
} 

輸入文件:

1 0.41 1 44 
0 1.23 2 555 

輸出文件:

0.41 1 44 1 
1.23 2 555 0 
+0

如果這是真的,OP應該解釋爲什麼1.23 2 555 0而不是0 1.23 2 555.我明白,OP需要先浮動然後剩下的,但不是很清楚如果是這樣的話 – Michi

+1

@Michi爲什麼他應該?他已經說了他想要的東西,我們不知道爲什麼,這是無關緊要的。 –

+0

你說得對,對不起我沒有注意到這個問題:) – Michi

1

想一想這些2行

str[strlen(str)] = ' '; 
str[strlen(str)+1] = temp; 

第一組空字符來' '。第二個調用strlen(str),但str不再具有導致未定義行爲(UB)的某個空字符。


建議,而不是

str[strcspn(str, "\r\n")] = '\0'; // lop off potential end-of-line characters. 
int prefix; 
int n; 
if (sscanf(str, "%d %n", &prefix, &n) != 1) Handle_Missing_Lead_int(); 
fprintf(out, "%s %d\n", &str[n], prefix); 

打開在文本模式下一個文件,然後寫"\r\n"也是一個問題,因爲代碼可以寫"\r",然後採取"\n"和翻譯比成"\r\n"導致在"\r\r\n"。建議在文本模式下打開文件並編寫一個"\n"(將根據需要進行翻譯)或以二進制模式打開文件並寫入明確的"\r\n"


BTW:考慮比15 char str[15];更慷慨。也許100?