我想知道如何用省略號替換 txt 檔案中不同句子中的所有空格。
例如:
- 原句:
Hi my name is Joseph. - 修改陳述句:
Hi... my... name... is... Joseph...
文本結構如下:
- 第 1 句。
- 第 2 句。
- 第 3 句。
- 第 4 句。
- …………
(每個句子都以點結尾)。我已經撰寫了一個代碼,但它只能從手動輸入的句子中使用:
#include<stdio.h>
int main() {
char ch = getchar();
while (ch != EOF) {
if (ch != '\n' && ch != ' ') {
putchar(ch);
ch = getchar();
}
else {
printf("... ");
while (ch == '\n' || ch == ' ') {
ch = getchar();
}
}
}
putchar('\n');
return 0;
}
有誰知道如何修改此代碼以從檔案中讀取句子并用點進行更改?
uj5u.com熱心網友回復:
有誰知道如何修改此代碼以從檔案中讀取句子
兩種方式:
- 使用 shell 重定向,例如
./a.out < input.txt - 使用
fopen,fgets,fclose. 見man fopen。
uj5u.com熱心網友回復:
型別錯誤
getchar()回傳一個int在unsigned char范圍或負EOF。這 257 個不同的值不能單獨保存在char. 使用int或冒無限回圈或過早停止的風險。
// char ch = getchar();
int ch = getchar();
讀/編輯/寫同一個檔案
從 file1 (
fopen(... "r"))讀取,調整" "為"...",將結果寫入用 (fopen(... "w"))打開的新 file2 。如果成功,將
rename()file1 放入file_temp。將檔案 2 重命名為檔案 1。如果成功,洗掉 file_temp。
重要的是在新檔案成功創建和命名之前不要洗掉舊檔案的資料 - 這有助于錯誤恢復。檢查各種 FILE 函式的回傳值以查找錯誤。
uj5u.com熱心網友回復:
您真的不想費心在代碼中進行檔案操作。shell 在處理檔案重定向方面做得很好,你應該使用它。如果您確實想要執行檔案操作代碼,請不要嘗試寫回原始檔案。如果您嘗試編輯檔案,則資料損壞的風險太大。將檔案視為不可變的。相反,寫入臨時檔案,然后根據需要將臨時檔案移到原始檔案上。這樣做幾乎總是想要你真正想要的。您并不關心生成的檔案是否與原始檔案相同;您只關心它在檔案系統中具有相同的名稱。將所有空格替換為...可以用下面的代碼來完成。如果您還要替換換行符,您可能應該替換所有空格,所以我選擇只替換問題陳述中的空格。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
FILE * xfopen(const char *path, const char *mode);
FILE * xfdopen(int fd, const char *mode);
int
main(int argc, char **argv)
{
int ch;
char template[] = "tmpfile.XXXXXXX";
const char *path = argc > 1 ? argv[1] : "stdin";
FILE *ifp = argc > 1 ? xfopen(path, "r") : stdin;
int ofd = argc > 1 ? mkstemp(template) : STDOUT_FILENO;
FILE *ofp = xfdopen(ofd, "w");
while( (ch = getc(ifp)) != EOF ){
if( ch != ' ' ){
fputc(ch, ofp);
} else {
fputs("...", ofp);
}
}
if( ofd != STDOUT_FILENO ){
if( rename(template, argv[1]) ){
perror(argv[1]);
return 1;
}
}
return 0;
}
FILE *
xfopen(const char *path, const char *mode)
{
FILE *fp = path[0] != '-' || path[1] != '\0' ? fopen(path, mode) :
*mode == 'r' ? stdin : stdout;
if( fp == NULL ){
perror(path);
exit(EXIT_FAILURE);
}
return fp;
}
FILE *
xfdopen(int fd, const char *mode)
{
FILE *fp = stdout;
if( fd != STDOUT_FILENO ){
fp = fdopen(fd, mode);
}
if( fp == NULL ){
perror("fdopen");
exit(EXIT_FAILURE);
}
return fp;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/406061.html
標籤:
上一篇:我試圖從并行陣列中洗掉一個元素
下一篇:讀取包含不同型別的格式化檔案
