我正在尝试读取文件并反转它的每一行并将其显示为C中的标准输出。
我的档案是:
$ cat f1
this is line 1
this is line 2
this is line 3
我的代码是:
#include <stdio.h>
#include <string.h>
void reverse_string(char *s) {
int l = strlen(s);
int i;
char sr[l];
int j = 0;
for (i = l - 1; i >= 0; i--) {
sr[j] = s[i];
j++;
}
printf("%s", sr);
}
int main(int argc, char *argv[]) {
FILE *fp;
int i;
char filename[128];
char line[100];
for (i = 1; i < argc; i++) {
strcpy(filename, argv[i]);
}
fp = fopen(filename, "r");
while (fgets(line, 128, fp) != NULL) {
if (strlen(line) != 0) {
reverse_string(line);
}
}
printf("\n");
}
输出是:
$ ./mycode f1
(blank line here)
1 enil si siht
2 enil si siht
3 enil si siht
我很困惑,为什么我的while循环会输出一个额外的空行,即使文件中没有空白行。
答案 0 :(得分:0)
fgets在nul char之前包含'/ n'。
所以当你翻转一个字符串时,你要做的第一件事就是打印它。
我的丑陋修复是:
用
替换第一个printfprintf("%s\n", sr+1);
删除第二个。
请记住,当一切都失败时,请阅读手册。:
fgets()从流和中读取最多一个小于大小的字符 将它们存储到s指向的缓冲区中。
在EOF或换行符后停止阅读。 如果读取换行符,则会将其存储到缓冲区中。
终止空字节('\ 0')存储在缓冲区中的最后一个字符之后。
答案 1 :(得分:0)
我也试图从文件中读取。我的文件包含用户名,在读取用户名后,我需要为每个用户添加一个常量字符。但是当我正在读取文件时,输出中出现了不需要的空行,并且常量字符显示在空行而不是用户名。
int main()
{
char buffer[20] ;
char i, j;
const char *a="love";
FILE *fp;
if ((fp = fopen("user.txt","r")) == NULL)
{
perror ("Error opening file");
}
while ( !feof(fp))
{
// read in the line and make sure it was successful
if (fgets(buffer,20,fp) != NULL)
{
cout << buffer << endl;
for(i = 0; buffer[i] != '\0'; ++i);
for(j = 0; a[j] != '\0'; ++j, ++i)
{
buffer[i] = a[j];
}
buffer[i] = '\0' ;
//cout << buffer << endl ;
}
}
}
我正在获得这样的输出
asharma5
love
as23w
love
qwssdd
love
我想要的输出是为每个用户名添加爱。
asharma5love
as23wlove
qwssddlove