在 C 的 VS2008 中使用 .txt
Working with .txt in VS2008 in C
我写了一些程序来覆盖 .txt 文件中的一些文本并将覆盖的文本放入另一个文件中 output.txt...但是它总是说文件无法打开。我该怎么办?
#include <stdio.h>
#include <ctype.h>
int main()
{
FILE *ul=fopen("hexbr.txt","r"),*iz=fopen("bitovi.txt","w");
int i;
char ch;
if ((!ul)||(!iz)) { printf("Neuspesno otvaranje datoteke!");return 0; }
while((ch=fgetc(ul))!=EOF)
{
if ((isdigit(ch)) || (c>='A' && c<='F'))
{
if (isalpha(ch))
switch(ch)
{
case 'A': { fputc('1',iz);fputc('0',iz);fputc('1',iz);fputc('0',iz);continue; }
case 'B': { fputc('1',iz);fputc('0',iz);fputc('1',iz);fputc('1',iz);continue; }
case 'C': { fputc('1',iz);fputc('1',iz);fputc('0',iz);fputc('0',iz);continue; }
case 'D': { fputc('1',iz);fputc('1',iz);fputc('0',iz);fputc('1',iz);continue; }
case 'E': { fputc('1',iz);fputc('1',iz);fputc('1',iz);fputc('0',iz);continue; }
case 'F': { fputc('1',iz);fputc('1',iz);fputc('1',iz);fputc('1',iz);continue; }
}
for(i=0;i<4;i++)
{
fputc((ch & 0X8)?'1':'0',iz);
ch<<=1;
}
}
else fputc(ch,iz);
if (ch=='\n') { ch=fgetc(ul);fputc(ch,iz); }
}
fclose(ul);
fclose(iz);
return 0;
}
程序没有编译成功,这里有一对错别字,c
应该是ch
:
... (c>='A' && c<='F') ...
除此之外,程序 几乎 可以运行,并且输出文件(与可执行文件在同一文件夹中创建)是可读的。
尝试处理 newline
个字符时出错,错误地导致下一个(打印)字符被传递而不是转换为二进制。我让 newline
和 return
像其他非十六进制字符一样通过。
除此之外,A..F
的处理很笨拙。我建议像这样诱捕他们:
while((ch=fgetc(ul))!=EOF)
{
if ((isdigit(ch)) || (ch>='A' && ch<='F'))
{
if (isalpha(ch))
ch -= 7;
for(i=0;i<4;i++)
{
fputc((ch & 0X8)?'1':'0',iz);
ch<<=1;
}
}
else fputc(ch,iz);
}
您可能还想检查并转换小写 a..f
。
我写了一些程序来覆盖 .txt 文件中的一些文本并将覆盖的文本放入另一个文件中 output.txt...但是它总是说文件无法打开。我该怎么办?
#include <stdio.h>
#include <ctype.h>
int main()
{
FILE *ul=fopen("hexbr.txt","r"),*iz=fopen("bitovi.txt","w");
int i;
char ch;
if ((!ul)||(!iz)) { printf("Neuspesno otvaranje datoteke!");return 0; }
while((ch=fgetc(ul))!=EOF)
{
if ((isdigit(ch)) || (c>='A' && c<='F'))
{
if (isalpha(ch))
switch(ch)
{
case 'A': { fputc('1',iz);fputc('0',iz);fputc('1',iz);fputc('0',iz);continue; }
case 'B': { fputc('1',iz);fputc('0',iz);fputc('1',iz);fputc('1',iz);continue; }
case 'C': { fputc('1',iz);fputc('1',iz);fputc('0',iz);fputc('0',iz);continue; }
case 'D': { fputc('1',iz);fputc('1',iz);fputc('0',iz);fputc('1',iz);continue; }
case 'E': { fputc('1',iz);fputc('1',iz);fputc('1',iz);fputc('0',iz);continue; }
case 'F': { fputc('1',iz);fputc('1',iz);fputc('1',iz);fputc('1',iz);continue; }
}
for(i=0;i<4;i++)
{
fputc((ch & 0X8)?'1':'0',iz);
ch<<=1;
}
}
else fputc(ch,iz);
if (ch=='\n') { ch=fgetc(ul);fputc(ch,iz); }
}
fclose(ul);
fclose(iz);
return 0;
}
程序没有编译成功,这里有一对错别字,c
应该是ch
:
... (c>='A' && c<='F') ...
除此之外,程序 几乎 可以运行,并且输出文件(与可执行文件在同一文件夹中创建)是可读的。
尝试处理 newline
个字符时出错,错误地导致下一个(打印)字符被传递而不是转换为二进制。我让 newline
和 return
像其他非十六进制字符一样通过。
除此之外,A..F
的处理很笨拙。我建议像这样诱捕他们:
while((ch=fgetc(ul))!=EOF)
{
if ((isdigit(ch)) || (ch>='A' && ch<='F'))
{
if (isalpha(ch))
ch -= 7;
for(i=0;i<4;i++)
{
fputc((ch & 0X8)?'1':'0',iz);
ch<<=1;
}
}
else fputc(ch,iz);
}
您可能还想检查并转换小写 a..f
。