2016-11-24 129 views
1

我想從每行開始在poem.txt中大寫其他每個單詞。我做了一個函數capitalize(),它接收一個字符串(例如:「一個像根三的孤獨數字」),大寫其他每個單詞並返回它(例如:返回「一個孤獨的數字像根三」)。我試圖從poem.txt讀取每行,將該行發送到大寫(),然後接收更新的字符串,並用更新的字符串替換該行,但我無法弄清楚如何。我測試了我的程序,它可以讀取文件的內容,並將它們發送到大寫()並逐行顯示,但無法寫入和替換每行。我嘗試使用fprintf(),但它不工作。你們能開導我嗎?使用C替換文本文件中的每一行C

一下poem.txt(執行前)
我擔心,我會永遠
一個孤獨的數字,如根3
三是所有的美好和正義,
爲什麼一定要我三看不見
在惡性方根符號下面,
我希望改爲我是一個九
九個會阻礙這個邪招,
只用一些簡單的算術
我知道我永遠也看不到太陽,爲1.7321
這就是我的現實,一個可悲的非理性
當徐克!這是什麼我看到,
的三
另一個平方根已悄然來臨華爾茲通過,
在一起,現在我們乘
形成一批我們願意,
大喜爲整數
我們從我們凡人的債券中掙脫
隨着魔棒的浪潮
我們的平方根s igns成爲脫膠
你對我的愛已續簽

代碼:

#define _GNU_SOURCE 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <ctype.h> 

int reverse(int otherWord) 
{ 
    if (otherWord) 
     return 0; 
    else 
     return 1; 
} 
void capitalise(char *s) 
{ 
    int start = 1; 
    int otherWord = 1; 
    for (; *s; s++) 
    { 
      if (start && otherWord) 
       *s = toupper(*s); 
      start = isspace(*s); 
      if (start) 
       otherWord = reverse(otherWord); 

    } 
} 
int main(int argc, char *argv[]) 
{ 
    FILE * fp; 
    char * line = NULL; 
    size_t len = 0; 
    ssize_t read; 

    fp = fopen("poem.txt", "r+"); 
    if (fp == NULL) 
     exit(EXIT_FAILURE); 

    while ((read = getline(&line, &len, fp)) != -1) { 
     capitalise(line); 
     fprintf(fp, "%s", line); // Here's the problem, this line! 

    } 

    fclose(fp); 
    if (line) 
     free(line); 
    exit(EXIT_SUCCESS); 
} 

詩。TXT(執行後):
我擔心,我會永遠
我擔心,我會一直
EE
的Ee
三是所有的美好和正義,
3是所有這是好的和正確的,
eath惡性平方根標誌,
艾比的Viciou廣場根號,
NE可阻止這個邪惡的伎倆,
NE可挫敗這個邪招,
知道我永遠也看不到太陽,爲1.7321
知道我永遠不會看到太陽,作爲1.7321
en hark!這是什麼我看,
恩哈克!這是什麼我明白了,
Ë
Ë
靜靜地進來華爾茲通過,
靜靜地來華爾茲通過,
形式的數量,我們願意,
表格,我們更喜歡號碼,
從我們的凡人債券中解脫出來
E破解我們的凡間債券
uare根號被掀開
Uare根號被掀開
EDED

一下poem.txt(預期執行):
我擔心,我會一直
一個孤獨的號碼,例如根三
...

+0

你需要'fseek'和'ftell'。讀取前用'ftell'保存位置。讀線。在寫之前用'fseek'設置位置並保存位置。 – BLUEPIXY

回答

2

該行因爲您正在寫入原始文件並同時讀取它,所以發生了複製。

事實證明,從文件中刪除和編輯行可能非常困難。如果要編輯文件中的行,可以使用一種簡單的方法寫入新的臨時文件,將其重命名爲原始文件,然後刪除臨時文件。

0

如果我沒有記錯的話,您應該能夠重寫該文件的內容,因爲它已經存在標誌「w」。用「w」代替你的「r +」

+1

我剛剛試過'w'。它所做的只是清空文件。 – Beginner

+0

我想我只清除了刪除現有數據的第一部分,因此您可以重寫 – Shazy

+0

我剛剛嘗試了一個使用「w +」的示例。我創建了一個文件,然後編寫了一個小程序來覆蓋內容,並且它做到了。 – Shazy

2

可以做到位,但它是危險的,如果失敗了,你可能會丟失數據。

稍微簡化版本將

#define _GNU_SOURCE 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <ctype.h> 

int reverse(int otherWord) 
{ 
    if (otherWord) { 
    return 0; 
    } else { 
    return 1; 
    } 
} 

void capitalise(char *s) 
{ 
    int start = 1; 
    int otherWord = 1; 
    for (; *s; s++) { 
    if (start && otherWord) { 
     *s = toupper(*s); 
    } 
    start = isspace(*s); 
    if (start) { 
     otherWord = reverse(otherWord); 
    } 
    } 
} 

int main(void) 
{ 
    FILE *fp; 
    char *line = NULL; 
    size_t len = 0; 
    ssize_t read; 
    long offset = 0L; 
    int res; 
    // you might prefer "w+" instead 
    fp = fopen("poem.txt", "r+"); 
    if (fp == NULL) { 
    fprintf(stderr, "Opening file poem.txt failed\n"); 
    exit(EXIT_FAILURE); 
    } 

    while ((read = getline(&line, &len, fp)) != -1) { 
    capitalise(line); 
    // set position relative to start of file 
    if ((res = fseek(fp, offset, SEEK_SET)) < 0) { 
     fprintf(stderr, "fseek failed\n"); 
     exit(EXIT_FAILURE); 
    } 
    // printing line sets file pointer to end of line 
    fprintf(fp, "%s", line); 
    // get that position 
    offset = ftell(fp); 
    } 
    // fclose() might fail, too, see man-page for details 
    fclose(fp); 
    if (line) { 
    free(line); 
    } 
    exit(EXIT_SUCCESS); 
} 
+0

謝謝,這個作品! – Beginner